2017-08-03 1 views
0

Nous migrons les ressources Apache CXF vers Spring MVC. Il est arrivé qu'il est préférable pour nous de migrer les ressources vers les services et d'avoir un grand contrôleur pour chacun d'entre eux. Voici ce que nous avions avant:Déplacer MockBean dans un objet de configuration séparé

@Component 
public class MainResource { 
    ... 
    @Path("/first") 
    public FirstResource getFirstResource() { 
    ... 
    @Path("/second") 
    public SecondResource getSecondResource() { 

@Component 
public class FirstResource { 
    @GET 
    @Path("/") 
    public FirstEntity getFirstEntity() { 

@Component 
public class SecondResource { 
    @GET 
    @Path("/") 
    public SecondEntity getSecondEntity() { 

Et voici ce que nous avons maintenant:

@Controller 
public class MainController { 
    @Resource 
    FirstService firstService; 
    @Resource 
    SecondService secondService; 
    ... 
    @GetMapping(/first) 
    public FirstEntity getFirst() { 
    ... 
    @GetMapping(/second) 
    public SecondEntity getSecond() { 

Mais quand il est venu à tester un contrôleur la question suivante surgie: nous voulons diviser les tests par service ainsi dans tous les test, nous devons utiliser @MockBean pour chaque service (il ne démarre pas le contexte de l'application sinon). Voici donc la question:

@RunWith(SpringRunner.class) 
@WebMvcTest(MainController.class) 
public class FirstWebMvcTest { 
    @MockBean 
    FirstService firstService; 
    @MockBean 
    SecondService secondService; 

    // testing /first call only. secondService is not used 

@RunWith(SpringRunner.class) 
@WebMvcTest(MainController.class) 
public class SecondWebMvcTest { 
    @MockBean 
    FirstService firstService; 
    @MockBean 
    SecondService secondService; 

    // testing /second call only. firstService is not used 

Nous ne voulons pas reproduire @MockBean. Comme une solution temporaire, je les ai tous transférés à la classe de base. Mais je n'aime pas étendre la classe de test de base pour obtenir ces définitions @MockBean, il me semble être une solution sale. Idéalement, je voudrais le déplacer vers une configuration ou autre chose.

Merci pour vos suggestions!

Répondre

1

Vous pouvez simplement créer une classe @Configuration dans votre src de test.

@Configuration 
@MockBean(FirstService.class) 
public class foo{ 

} 

etc.

et l'importer au besoin, ou si la numérisation composants ajouter un @Profile à elle il sera actif quand un certain profil est actif pour les tests et l'utilisation des haricots simulacres.

+1

Hm, mais il n'injecte pas de mocks dans les tests. –