J'ai créé plusieurs classes de tests Spring-Boot, (avec spring-boot
1.4.) .
FirstActionTest.Java:
@RunWith(SpringRunner.class)
@WebMvcTest(FirstAction.class)
@TestPropertySource("classpath:test-application.properties")
public class FirstActionTest {
@Autowired
private MockMvc mvc;
// ...
}
SecondActionTest.Java:
@RunWith(SpringRunner.class)
@WebMvcTest(SecondAction.class)
@TestPropertySource("classpath:test-application.properties")
public class SecondActionTest {
@Autowired
private MockMvc mvc;
// ...
}
Lors de l'exécution du test via:
test mvn
Il semble avoir créé un contexte de test de printemps pour chaque classe de test, ce qui n'est pas nécessaire, je suppose.
La question est:
En utilisant deux classes différentes avec @WebMvcTest
(C'est-à-dire @WebMvcTest(FirstAction.class)
et @WebMvcTest(SecondAction.class)
), vous indiquez spécifiquement que vous souhaitez des contextes d'application différents. Vous ne pouvez pas partager un seul contexte dans ce cas car chaque contexte contient un ensemble différent de beans. Si vous êtes des haricots de contrôleur qui se comportent assez bien, le contexte devrait être relativement rapide à créer et vous ne devriez pas vraiment avoir de problème.
Si vous voulez vraiment avoir un contexte qui peut être mis en cache et partagé entre tous les tests Web, vous devez vous assurer qu'il contient exactement les mêmes définitions de bean. Deux options qui vous viennent à l'esprit:
1) Utilisez @WebMvcTest
Sans aucun contrôleur spécifié.
FirstActionTest:
@RunWith(SpringRunner.class)
@WebMvcTest
@TestPropertySource("classpath:test-application.properties")
public class FirstActionTest {
@Autowired
private MockMvc mvc;
// ...
}
SecondActionTest:
@RunWith(SpringRunner.class)
@WebMvcTest
@TestPropertySource("classpath:test-application.properties")
public class SecondActionTest {
@Autowired
private MockMvc mvc;
// ...
}
2) N'utilisez pas du tout @WebMvcTest
Pour obtenir un contexte d'application qui contient tous les beans (pas seulement des problèmes Web)
FirstActionTest:
@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource("classpath:test-application.properties")
public class FirstActionTest {
@Autowired
private MockMvc mvc; // use MockMvcBuilders.webAppContextSetup to create mvc
// ...
}
SecondActionTest:
@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource("classpath:test-application.properties")
public class SecondActionTest {
@Autowired
private MockMvc mvc; // use MockMvcBuilders.webAppContextSetup to create mvc
// ...
}
Gardez à l'esprit qu'un contexte mis en cache peut accélérer l'exécution de plusieurs tests, mais si vous exécutez plusieurs fois un seul test au moment du développement, vous payez le coût de la création d'un grand nombre de beans qui sont ensuite immédiatement jetés.