2017-09-26 1 views
0

J'ai un contrôleur qui ajoute des attributs de application.properties à un objet Model:Spring Boot - Comment tester cet attribut de modèle a été ajouté à partir du fichier de configuration?

@Value("${products}") 
private String prod; 

@GetMapping("/") 
public String greetingForm(Model model) throws IOException { 

    List<String> products = Arrays.asList(prod.split("\\s*,\\s*")); 

    model.addAttribute("products",products); 

    return "form"; 
} 

Comment puis-je tester cette méthode? Je suis relativement nouveau aux tests unitaires, donc tout conseil serait apprécié. Je sais que je dois simuler Model mais à chaque fois que j'essaie d'exécuter mon test, j'obtiens un NullPointerException.

Mon test:

private MockMvc mockMvc; 

@MockBean 
private Model model; 

@Before 
public void setUp() { 
    this.mockMvc = MockMvcBuilders.standaloneSetup(new WebController()).build(); 
} 



@Test 
public void testHomeRoute() { 

     try { 

      List<String> products = new ArrayList<String>(); 
      products.add("Product1"); 
      products.add("Product2"); 

      mockMvc.perform(get("/")) 
       .andExpect(MockMvcResultMatchers.view().name("form")) 
       .andExpect(MockMvcResultMatchers.model().attribute("products",products)); 
       ; 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

} 

Merci à l'avance.

Répondre

0

Vous devez vous assurer qu'une copie de application.properties se trouve dans votre dossier src/test/resources pour vous assurer que les tests unitaires détectent ces propriétés.

Assurez-vous également que votre classe de test est annotée avec @SpringBootTest afin que la configuration appropriée pour charger les propriétés soit chargée dans vos tests.

EDIT: Vous ne voulez pas aussi appeler nouveau sur votre contrôleur ici:

this.mockMvc = MockMvcBuilders.standaloneSetup(new WebController()).build(); 

par vous-même instatiating il n'est plus un grain de printemps et l'annotation @Value ne sera pas injecté correctement dans cette classe pour vous. Au lieu de cela, vous devriez autowire votre contrôleur et l'utiliser pour construire votre MockMvc.

@Autowired 
private WebController webController; 

@Before 
public void setUp() { 
    this.mockMvc = MockMvcBuilders.standaloneSetup(webController).build(); 
}