[JAVA] Frühling super Klasse verspotten

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.

Fehlerbeispiel

** 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.

Was ist los

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.

Lösung

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();
    }
}

Für @ 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();
    }
}

Referenz

Qualifier-Tag mit Autowired of Spring Framework verwenden

Recommended Posts

Frühling super Klasse verspotten
Frühling × Docker
Über den Frühling ③
Frühling Java