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 entfernen MockitoJUnitRunner
und programmgesteuert tun, was es tut.
Tatsächlich läuft es nur so:
MockitoAnnotations.initMocks(test);
am Anfang des Testfalls. Die einfachste Lösung besteht also darin, diesen Code in eine setUp()
Methode einzufügen:
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
Ich bin nicht sicher, aber wahrscheinlich sollten Sie einen Mehrfachaufruf dieser Methode mit flag vermeiden:
private boolean mockInitialized = false;
@Before
public void setUp() {
if (!mockInitialized) {
MockitoAnnotations.initMocks(this);
mockInitialized = true;
}
}
Eine bessere, wiederverwendbare Lösung kann jedoch mit den Regeln von JUnt implementiert werden.
public class MockitoRule extends TestWatcher {
private boolean mockInitialized = false;
@Override
protected void starting(Description d) {
if (!mockInitialized) {
MockitoAnnotations.initMocks(this);
mockInitialized = true;
}
}
}
Fügen Sie Ihrer Testklasse nun einfach die folgende Zeile hinzu:
@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
und Sie können diesen Testfall mit jedem gewünschten Läufer ausführen.