web-dev-qa-db-fra.com

Spring-boot testing - plusieurs tests peuvent-ils partager un même contexte?

J'ai créé plusieurs classes de tests Spring-Boot, (avec spring-boot1.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:

  • Est-il possible de partager un contexte de test de ressort unique entre plusieurs classes de test, et si oui, comment?
14
Eric Wang

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.

9
Phil Webb