Ich konnte den Test, der die Superklasse im Frühjahr verspottete, nicht durchführen und blieb eine Weile stecken. Ich musste die Klasse identifizieren, um mich zu verspotten.
** Mit Spring Boot 2.0.5 überprüft **
Bereiten Sie zwei Klassen mit einer Vererbungsbeziehung vor.
Diese werden mit @ Component
in den DI-Container getaucht.
** Superklasse **
@Component
public class SuperClass {
void superClassMethod() {
System.out.println("Sie haben eine Superklassenmethode aufgerufen.");
}
}
** Unterklasse **
@Component
public class SubClass extends SuperClass {
void subClassMethod() {
System.out.println("Sie haben eine Methode in einer Unterklasse aufgerufen.");
}
}
Schreiben Sie einen Test, um eine Superklasse mit @ MockBean
zu verspotten.
** Testcode **
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SampleTest {
@MockBean
SuperClass superClass;
@Test
public void sampleTest() {
doNothing().when(superClass).superClassMethod();
}
}
Ich werde das machen.
** Ergebnis der Testausführung **
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]
Sicher gestorben.
In der Ausnahmemeldung gibt es die folgende Beschreibung.
expected a single matching bean to replace but found [subClass, superClass]
Kurz gesagt: "Da es zwei spöttische Ziele gibt, subClass und superClass, weiß ich nicht, welches verspottet werden soll." Wenn es in der Verspottungszielklasse eine Unterklasse gibt, wird diese auch als Verspottungsziel bestimmt.
Verwenden Sie einfach "@ Quelifer", um "Mock the superclass!" Zu deklarieren, wie unten gezeigt.
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SampleTest {
@MockBean
@Qualifier("superClass")
SuperClass superClass;
@Test
public void sampleTest() {
doNothing().when(superClass).superClassMethod();
}
}
@ SpyBean
Im Fall von "@ SpyBean", das methodisch verspottet werden kann, tritt ein Fehler mit dem gleichen Gefühl auf.
** Testcode **
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SampleTest {
@SpyBean
SuperClass superClass;
@Test
public void sampleTest() {
doNothing().when(superClass).superClassMethod();
}
}
** Ergebnis der Testausführung **
java.lang.IllegalStateException: No bean found for definition [SpyDefinition@f2b90fc name = '', typeToSpy = com.example.vendingmachine.sample.SuperClass, reset = AFTER]
In diesem Fall ist es in Ordnung, wenn Sie den Namen der Superklasse wie unten gezeigt in das Attribut "name" von "@ SpyBean" einfügen.
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SampleTest {
@SpyBean(name = "superClass")
SuperClass superClass;
@Test
public void sampleTest() {
doNothing().when(superClass).superClassMethod();
}
}
Qualifier-Tag mit Autowired of Spring Framework verwenden
Recommended Posts