5 votes

Tester Spring Boot @WebMvcTest pour un contrôleur semble charger d'autres contrôleurs dans le contexte

Voici mon cas de test pour un contrôleur Spring

@RunWith(SpringRunner.class)
@WebMvcTest(value = MyController.class)
public class MyControllerTest {

    @MockBean
    private MyService myService;
}

Il s'agit donc d'un test unitaire spécifique pour les méthodes de MyController. Mais lorsque je lance le test, Spring semble commencer à instancier OtherController et toutes ses dépendances.

J'ai essayé de mettre à jour ce qui précède comme suit

@RunWith(SpringRunner.class)
@WebMvcTest(value = MyController.class, excludeFilters = @ComponentScan.Filter(value= OtherController.class, type = FilterType.ANNOTATION))

public class MyControllerTest {

...
}

Mais Spring semble toujours le câbler. Voici l'erreur lancée par Spring lorsqu'il tente d'instancier OtherController lorsque je lance le test ci-dessus spécifiquement.

2017-01-06 12:09:46.207  WARN 18092 --- [           main] o.s.w.c.s.GenericWebApplicationContext   : Exception rencontrée lors de l'initialisation du contexte - tentative d'annulation de l'actualisation : org.springframework.beans.factory.UnsatisfiedDependencyException: Erreur de création du bean avec le nom 'otherController' défini dans le fichier [C:..OtherController.class] : Dépendance non satisfaite exprimée à travers le paramètre 0 du constructeur ; exception imbriquée est org.springframework.beans.factory.UnsatisfiedDependencyException: Erreur de création du bean avec le nom 'getOtherService' défini dans com.my.myApplication: Dépendance non satisfaite exprimée à travers la méthode 'getOtherService' paramètre 0org.springframework.beans.factory.UnsatisfiedDependencyException: Erreur de création du bean avec le nom 'getOtherService' défini dans com.myOrg.MyServiceApplication: Dépendance non satisfaite exprimée à travers la méthode 'getPositionService' paramètre 0

Qu'est-ce qui pourrait causer cela?

0voto

Antonio Points 594

Il est probable que vous déclenchiez accidentellement le balayage de bean via un @Componentscan ou similaire.

Par exemple, comme expliqué dans cette réponse, Spring peut détecter votre classe "production" @SpringBootApplication Application, avec tous les balayages de composants qu'elle entraîne. Si c'est le cas, assurez-vous de "surécrire" votre classe "production" Application avec votre classe "test" en mettant...

@SpringBootApplication
public class Application {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

...dans un emplacement qui remplacera la classe "Production" Application.

Par exemple, si votre IDE ne gère pas les conflits de noms de classe:

"production" -> src/main/java/com/mycompany/Application.java
             -> src/main/java/com/mycompany/controllers/MyController.java
"test"       -> src/test/java/com/mycompany/Application.java
             -> src/test/java/com/mycompany/controllers/MyControllerTest.java

En alternative, j'ai également constaté que dans mon cas, cela fonctionne également (c'est-à-dire placer l'Application dans le dossier des contrôleurs de test)

"production" -> src/main/java/com/mycompany/Application.java
             -> src/main/java/com/mycompany/controllers/MyController.java
"test"       -> src/test/java/com/mycompany/controllers/Application.java
             -> src/test/java/com/mycompany/controllers/MyControllerTest.java

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X