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.