Ich schreibe Unit Test und möchte JUnitParamsRunner
und MockitoJUnitRunner
für eine Testklasse verwenden.
Leider funktioniert folgendes nicht:
@RunWith(MockitoJUnitRunner.class)
@RunWith(JUnitParamsRunner.class)
public class DatabaseModelTest {
// some tests
}
Gibt es eine Möglichkeit, Mockito und JUnitParams in einer Testklasse zu verwenden?
java
unit-testing
junit
Hans-Helge
quelle
quelle
Antworten:
Sie können dies nicht tun, da Sie gemäß Spezifikation dieselbe Annotation nicht zweimal auf dasselbe annotierte Element setzen können.
Also, was ist die Lösung? Die Lösung besteht darin, nur einen
@RunWith()
mit einem Läufer zu platzieren, ohne den Sie nicht stehen können, und den anderen durch einen anderen zu ersetzen. In Ihrem Fall werden Sie wahrscheinlich entfernenMockitoJUnitRunner
und programmgesteuert tun, was es tut.Tatsächlich läuft es nur so:
am Anfang des Testfalls. Die einfachste Lösung besteht also darin, diesen Code in eine
setUp()
Methode einzufügen:Ich bin nicht sicher, aber wahrscheinlich sollten Sie einen Mehrfachaufruf dieser Methode mit flag vermeiden:
Eine bessere, wiederverwendbare Lösung kann jedoch mit den Regeln von JUnt implementiert werden.
Fügen Sie Ihrer Testklasse nun einfach die folgende Zeile hinzu:
und Sie können diesen Testfall mit jedem gewünschten Läufer ausführen.
quelle
mockInitialized
ist falsch. Sie möchten für jeden Tetst einen neuen Mock haben.Ab JUnit 4.7 und Mockito 1.10.17 ist diese Funktionalität integriert. Es gibt eine
org.mockito.junit.MockitoRule
Klasse. Sie können es einfach importieren und die Zeile hinzufügenzu Ihrer Testklasse.
quelle
@Rule public MockitoJUnitRule mockito = new MockitoJUnitRule(this);
MockitoAnnotations.initMocks(this)
ist sehr langsam, um Mocks zu erstellen. Der effizienteste Weg ist die Verwendung der @Runwith (MockitoJunitRunner.class)Diese Lösung funktioniert für jeden möglichen Läufer, nicht nur für dieses Mockito-Beispiel. Beispielsweise; Ändern Sie für Spring einfach die Runner-Klassen und fügen Sie die erforderlichen Anmerkungen hinzu.
DatabaseModelTest
wird von JUnit ausgeführt.TestMockitoJUnitRunner
davon abhängt (durch die Logik) , und es wird ausgeführt werden , im Innern des Hauptes in einem@Test
Verfahren, während des AnrufsJUnitCore.runClasses(TestMockitoJUnitRunner.class)
. Diese Methode stellt sicher, dass der Hauptläufer korrekt gestartet wird, bevor derstatic class TestMockitoJUnitRunner
Unterläufer ausgeführt wird, und implementiert effektiv mehrere verschachtelte@RunWith
Anmerkungen mit abhängigen Testklassen.Auch auf https://bekce.github.io/junit-multiple-runwith-dependent-tests
quelle
JUnitCore.runClasses()
ohne das Ergebnis zu überprüfen, riskieren Sie, die Fehler aus dem inneren Test zu maskieren.assert(JUnitCore.runClasses(TestMockitoJUnitRunner.class).wasSuccessful());
wird Ihnen zumindest den Fehler meldenSeit der Veröffentlichung von PowerMock 1.6 können Sie dies so einfach wie möglich tun
Hier erklärt https://blog.jayway.com/2014/11/29/using-another-junit-runner-with-powermock/
quelle
In meinem Fall habe ich versucht, eine Methode in Spring Bean und zu verspotten
funktioniert nicht Stattdessen müssen Sie diese Bean so definieren, dass sie mithilfe der Mock-Methode in Ihrer XML-Datei wie folgt erstellt wird.
und fügen Sie diese Bean mit Autowired in Ihrer Testklasse wie folgt hinzu.
quelle
Schauen Sie sich diesen Link an: https://bekce.github.io/junit-multiple-runwith-dependent-tests/ Mit diesem Ansatz kombinierte ich einen @ RunWith (Parameterized.class) - äußeren Läufer - mit @RunWith (MockitoJUnitRunner.class) - Innenläufer. Die einzige Änderung, die ich hinzufügen musste, bestand darin, meine Mitgliedsvariablen in der äußeren Klasse / dem Läufer statisch zu machen, um sie für den inneren / verschachtelten Läufer / die Klasse zugänglich zu machen. Glück haben und genießen.
quelle
Ich wollte SWTBotJunit4ClassRunner und org.junit.runners.Parameterized gleichzeitig ausführen , ich habe parametrische Tests und ich möchte Screenshots machen, wenn der SWT-Test fehlschlägt (die Screenshot-Funktion wird von bereitgestellt SWTBotJunit4ClassRunner bereitgestellt ). Die Antwort von @ bekce ist großartig und wollte zuerst diesen Weg gehen, aber es war entweder skurril, die Argumente durchzugehen. Oder führen Sie die Parameter in der Unterklasse aus und verlieren Sie die Informationen darüber, welche genauen Tests bestanden / fehlgeschlagen sind und nur den letzten Screenshot haben (da die Screenshotnamen den Namen vom Test selbst erhalten). So oder so war es ein bisschen chaotisch.
In meinem Fall ist der SWTBotJunit4ClassRunner einfach genug, also habe ich den Quellcode der Klasse geklont, ihm meinen eigenen Namen ParametrizedScreenshotRunner gegeben und wo original den TestRunner erweitert hat , erweitert meine Klasse den parametrisierte Klasse, sodass ich im Wesentlichen meinen eigenen Runner verwenden kann anstelle der beiden vorherigen. Mein eigener Läufer erstreckt sich über den parametrisierten Läufer, während die Screenshot-Funktion darüber implementiert wird. Jetzt verwendet mein Test diesen "Hybrid" -Läufer und alle Tests funktionieren wie erwartet sofort (es ist nicht erforderlich, irgendetwas innerhalb der Tests zu ändern).
So sieht es aus (der Kürze halber habe ich alle Kommentare aus der Liste entfernt):
quelle
Sie können dies auch versuchen:
quelle