Dans mon test Spring Boot, j'utilise 2 mock beans avec des qualificatifs différents:
@RunWith(SpringRunner.class) @SpringBootTest @MockBean(IHaha.class) @MockBean(IHaha.class) class HohoTest {}
Comme je n'utilise pas ces beans explicitement, je préfère les éloigner du corps de la classe , comme l'annotation @MockBean
est maintenant répétable:
@RunWith(SpringRunner.class) @SpringBootTest class HohoTest { @MockBean @Qualifier("haha") IHaha ahaha; @MockBean @Qualifier("hoho") IHaha ohoho; }
Cependant, je dois également passer un qualificatif, car ils ont le même type . Une idée sur la façon dont je peux y parvenir?
3 Réponses :
Lors de la déclaration de @MockBean
au niveau de la classe, il n'y a actuellement aucun support pour fournir un qualificatif .
Si vous souhaitez bénéficier d'un tel support, je vous suggère de le demander au printemps Outil de suivi des problèmes de démarrage .
Sinon, vous devrez continuer à déclarer @MockBean
dans les champs à côté de @Qualifier
.
Si vous pouvez déplacer complètement la définition fictive hors de la classe de test, vous pouvez également créer les mocks dans une classe @Configuration
distincte:
@Configuration public class MockConfiguration { @Bean @Qualifier("haha") public IHaha ahaha() { return Mockito.mock(IHaha.class); } @Bean @Qualifier("hoho") public IHaha ohoho() { return Mockito.mock(IHaha.class); } }
p >
Merci! Tu as sauvé ma journée.
J'avais une exigence similaire d'injecter des haricots de service simulés avec l'annotation @Order . J'avais également besoin de vérifier le nombre d'appels des fonctions de service. Voici ma mise en œuvre. Cela pourrait aider quelqu'un.
import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class ServiceNameTest { @Autowired private ServiceName serviceName; // Important: Used to reset interaction count of our static // bean objects before every test. @Before public void reset_mockito_interactions() { Mockito.clearInvocations(MockServicesConfig.bean1); Mockito.clearInvocations(MockServicesConfig.bean2); } @Configuration public static class MockServicesConfig { public static InterfaceName bean1; public static InterfaceName bean2; @Bean @Order(1) public InterfaceName bean1() { bean1 = Mockito.mock(InterfaceName.class); // Common when() stubbing return bean1; } @Bean @Order(2) public InterfaceName vmpAdapter() { bean2 = Mockito.mock(InterfaceName.class); // Common when() stubbing return bean2; } } @Test public void test_functionName_mock_invocation1() { // Arrange --> Act --> Assert // nullify other functions custom when() stub. // updating this functions custom when() stub. verify(MockServicesConfig.bean1, times(1)).functionName(""); } @Test public void test_functionName_mock_invocation2() { // Arrange --> Act --> Assert // nullify other functions custom when() stub. // updating this functions custom when() stub. verify(MockServicesConfig.bean1, times(1)).functionName(""); } }
Dans votre test, vous démarrez le contexte de printemps, il est donc nécessaire d'ajouter un Qualifier Bean. Pourquoi ne pas laisser les annotations MockBean, c'est juste une classe de test.