[JAVA] Se moquer de la super classe du printemps

Je n'ai pas pu exécuter le test qui se moquait de la super classe au printemps, et je suis resté coincé pendant un moment. J'avais besoin d'identifier la classe à se moquer.

Exemple d'échec

** Confirmé avec Spring Boot 2.0.5 **

Préparez deux classes qui ont une relation d'héritage. Ceux-ci sont plongés dans le conteneur DI avec @ Component.

** Super classe **

@Component
public class SuperClass {

    void superClassMethod() {
        System.out.println("Vous avez appelé une méthode de superclasse.");
    }
}

** Sous-classe **

@Component
public class SubClass extends SuperClass {

    void subClassMethod() {
        System.out.println("Vous avez appelé une méthode dans une sous-classe.");
    }
}

Ecrivez un test pour simuler et utiliser une superclasse avec @ MockBean.

** Code de test **

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SampleTest {

    @MockBean
    SuperClass superClass;

    @Test
    public void sampleTest() {
        doNothing().when(superClass).superClassMethod();
    }
}

Je le ferai.

** Résultat de l'exécution du test **

Caused by: java.lang.IllegalStateException: Unable to register mock bean com.example.vendingmachine.sample.SuperClass expected a single matching bean to replace but found [subClass, superClass]

Mort en toute sécurité.

Qu'est-ce qui ne va pas

En regardant le message d'exception, il y a la description suivante.

expected a single matching bean to replace but found [subClass, superClass]

En bref, "Puisqu'il y a deux cibles moqueuses, subClass et superClass, je ne sais pas laquelle doit être moquée." S'il existe une sous-classe dans la classe cible moqueuse, elle est également déterminée comme étant la cible moqueuse.

Solution

Utilisez simplement @ Quelifer pour déclarer" Mock the superclass! "Comme indiqué ci-dessous.

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SampleTest {

    @MockBean
    @Qualifier("superClass")
    SuperClass superClass;

    @Test
    public void sampleTest() {
        doNothing().when(superClass).superClassMethod();
    }
}

Pour @ SpyBean

Dans le cas de @ SpyBean qui peut être simulé méthode par méthode, une erreur se produira avec le même sentiment.

** Code de test **

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SampleTest {

    @SpyBean
    SuperClass superClass;

    @Test
    public void sampleTest() {
        doNothing().when(superClass).superClassMethod();
    }
}

** Résultat de l'exécution du test **

java.lang.IllegalStateException: No bean found for definition [SpyDefinition@f2b90fc name = '', typeToSpy = com.example.vendingmachine.sample.SuperClass, reset = AFTER]

Dans ce cas, c'est OK si vous mettez le nom de la super classe dans l'attribut name de @ SpyBean comme indiqué ci-dessous.

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SampleTest {

    @SpyBean(name = "superClass")
    SuperClass superClass;

    @Test
    public void sampleTest() {
        doNothing().when(superClass).superClassMethod();
    }
}

référence

Utiliser la balise Qualifier avec Autowired of Spring Framework

Recommended Posts

Se moquer de la super classe du printemps
printemps × docker
À propos du printemps ③
Spring Java