Hallo Leute,
ich kämpfe gerade etwas mit Mockito und bräuchte eure Hilfe.
Um das Beispiel etwas verständlicher zu machen erkläre ich den aktuellen Stand in vereinfachter Form.
Ich habe eine Benchmark Klasse deren Aufgabe es ist, einen beliebigen Task zu erledigen.
Die Benchmark Klasse hat einen Konstruktor (der einen Dateipfad erwartet) und eine executeBenchmark() Methode.
Der Konstruktor verarbeitet die empfangene Datei "irgendwie" um nähere Informationen zu dem Task zu gewinnen.
Die executeBenchmark()-Methode instantiiert ein BenchmarkTask Objekt mit den, aus der Datei gewonnenen, informationen und führt den Task danach aus.
Hier ein stark vereinfachter Code.
Jetzt würde ich gerne einen Test schreiben, der die executeBenchmark()-Methode ausführt und sicherstellt, dass die executeTask()-Methode 1 mal aufgerufen wurde.
Nun stoße ich aber auf mindestens 2 Probleme.
Normalerweise mockt man ja eine Klasse und delegiert das Objekt weiter um es sozusagen "einzuschleusen".
Also ungefähr so:
Die Methode executeBenchmark() erwartet jedoch keine Delegation. Problem Nr. 1!
"Nicht schlimm" dachte ich mir und habe einfach eine eingebaut, womit ich auf das zweite Problem aufmerksam wurde.
Problem Nr. 2: Auch wenn das gemockte Objekt hierhin delegiert wurde, instantiert die Methode ja trotzdem ein "echtes" BenchmarkTask Objekt.
Kann man in diesem Fall denn überhaupt mocken? Und wenn ja, wie?
Hoffe ich habe es verständlich genug gemacht und bedanke mich im Voraus.
ich kämpfe gerade etwas mit Mockito und bräuchte eure Hilfe.
Um das Beispiel etwas verständlicher zu machen erkläre ich den aktuellen Stand in vereinfachter Form.
Ich habe eine Benchmark Klasse deren Aufgabe es ist, einen beliebigen Task zu erledigen.
Die Benchmark Klasse hat einen Konstruktor (der einen Dateipfad erwartet) und eine executeBenchmark() Methode.
Der Konstruktor verarbeitet die empfangene Datei "irgendwie" um nähere Informationen zu dem Task zu gewinnen.
Die executeBenchmark()-Methode instantiiert ein BenchmarkTask Objekt mit den, aus der Datei gewonnenen, informationen und führt den Task danach aus.
Hier ein stark vereinfachter Code.
Java:
public class Benchmark {
private String taskDescription ;
public Benchmark(String pathToBenchmarkFile) {
taskDescription = processBenchmarkFile(pathToBenchmarkFile) ;
}
public void executeBenchmark() {
BenchmarkTask task = new BenchmarkTask(taskDescription) ;
task.executeTask();
}
}
Jetzt würde ich gerne einen Test schreiben, der die executeBenchmark()-Methode ausführt und sicherstellt, dass die executeTask()-Methode 1 mal aufgerufen wurde.
Nun stoße ich aber auf mindestens 2 Probleme.
Normalerweise mockt man ja eine Klasse und delegiert das Objekt weiter um es sozusagen "einzuschleusen".
Also ungefähr so:
Java:
public void shouldCallExecuteTask() {
BenchmarkTask mockedTask = Mockito.mock(BenchmarkTask.class) ;
Benchmark benchmark = new Benchmark("someFile.txt") ;
// hier wird das Objekt delegiert
benchmark.executeBenchmark(mockedTask);
Mockito.verify(mockedTask, Mockito.times(1)).executeTask();
}
Die Methode executeBenchmark() erwartet jedoch keine Delegation. Problem Nr. 1!
"Nicht schlimm" dachte ich mir und habe einfach eine eingebaut, womit ich auf das zweite Problem aufmerksam wurde.
Java:
// mit eingebauter Delegation
public void executeBenchmark(BenchmarkTask task) {
task = new BenchmarkTask(taskDescription) ;
task.executeTask();
}
Problem Nr. 2: Auch wenn das gemockte Objekt hierhin delegiert wurde, instantiert die Methode ja trotzdem ein "echtes" BenchmarkTask Objekt.
Kann man in diesem Fall denn überhaupt mocken? Und wenn ja, wie?
Hoffe ich habe es verständlich genug gemacht und bedanke mich im Voraus.