4
votes

Créer @MockBean avec qualificatif en annotant la classe?

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?


1 commentaires

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.


3 Réponses :


2
votes

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 .


0 commentaires

3
votes

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 >


1 commentaires

Merci! Tu as sauvé ma journée.



1
votes

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("");
  }


}


0 commentaires