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.
** 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é.
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.
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();
}
}
@ 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();
}
}
Utiliser la balise Qualifier avec Autowired of Spring Framework