Wir haben unser eigenes Framework erstellt, das die Einrichtung einer Analyse-Pipeline vereinfacht. Jedes Mal, wenn eine Analyse endet, wird finish() aufgerufen. finish() lädt Dateien hoch, die während der Analyse generiert wurden. Um sicherzustellen, dass das Framework korrekt verwendet wurde, haben wir überprüft, dass finish() nicht zweimal aufgerufen wird.So verwenden Sie Mockito, um die Anzahl der Aufrufe einer Funktion zu überprüfen, ohne dass Mockito einen zusätzlichen Anruf tätigt.
Nun möchte ich testen, dass finish() für einen bestimmten Schritt in der Pipeline aufgerufen wird. Ich mache das folgende in meinem Test durch den Aufruf:
verify(consumer).finish();
Aber anscheinend verify() ruft auch finish() so eine Ausnahme ausgelöst wird und der Test fehlschlägt.
Nun, meine Frage ist:
- Wie ich zu vermeiden, die fertig sind() zweimal aufgerufen wird?
EDIT
Eine schnelle Einrichtung des Problems:
Analyse
package mockitoTwice;
public class Analysis extends Finishable {
@Override
public void finishHelper() {
System.out.println("Calling finishHelper()");
}
}
konfektionierbar
package mockitoTwice;
public abstract class Finishable {
protected boolean finished = false;
public final void finish() {
System.out.println("Calling finish()");
if (finished) {
throw new IllegalStateException();
}
finished = true;
finishHelper();
}
public abstract void finishHelper();
}
Pipeline
package mockitoTwice;
public class Pipeline {
private Analysis analysis;
public Pipeline(Analysis analysis) {
this.analysis = analysis;
}
public void runAnalyses() {
analysis.finish();
}
}
PipelineTest
package mockitoTwice;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import org.junit.Test;
public class PipelineTest {
@Test
public void test() {
Analysis analysis = mock(Analysis.class);
Pipeline pipeline = new Pipeline(analysis);
pipeline.runAnalyses();
verify(analysis).finish();
}
}
Jemand anderes postete genau den gleichen Vorschlag. Diese Lösung funktioniert nicht. Eine Ausnahme wird weiterhin ausgelöst. Probieren Sie es im obigen Code aus. –