um näher zu 100% zu kommen, würde ich gerne die Hauptmethode testen. Ich erstelle nur eine Instanz einer Klasse, die die Anwendung starten soll. Test und Code sieht so aus:testen Hauptmethode mit jmockit
public class MainTest {
@Test
public void delegates_to_Launcher_instance(@Mocked Launcher launcher) {
String[] args = {"i"};
Main.main(args);
new Verifications() {{ launcher.run(args); }};
}
}
public class Main {
public static void main(String[] args) {
new Launcher().run(args);
}
}
public class Launcher {
public void run(String[] args) {
}
}
Funktioniert perfekt!
Jetzt ist die Launcher-Klasse ein wenig überflüssig, und Coverage ist nicht 100%, weil der Konstruktor von Main nicht aufgerufen wird. Beide könnten, indem Sie den Code aus Launcher Haupt, wie dies geheilt werden:
public class MainTest {
@Test
public void delegates_to_Main_instance(@Mocked Main main) {
String[] args = {"i"};
Main.main(args);
new Verifications() {{ main.run(args); }};
}
}
public class Main {
public static void main(String[] args) {
new Main().run(args);
}
}
Aber wenn ich das tue, JMockit klagt mit:
Missing invocation to:
mmm.Main#run(["i"])
on mock instance: [email protected]
at mmm.MainTest$1.<init>(MainTest.java:15)
at mmm.MainTest.delegates_to_Main_instance(MainTest.java:15)
Caused by: Missing invocation
at mmm.Main.run(Main.java)
... 2 more
Kann jemand erklären, was hier vor sich geht?
Nicht verwandt: Lesen Sie über Java-Namenskonventionen. Verwenden von _ ist nur für SOME_CONSTANTS - aber "_" geht nicht in Methodennamen! – GhostCat
GhostCats Antworten sind korrekt. Ich werde nur hinzufügen, dass die ganze Idee, hier zu spotten, schlecht ist. Ein guter Test bestätigt, dass eine gegebene Klasse "A" das * große geschäftliche Problem löst *, das es lösen soll, * nicht *, dass es irgendeine Methode in der Klasse "B" aufruft. Außerdem sollten Tests nicht geschrieben werden, um die * Code * Abdeckung zu erhöhen, sondern um die Abdeckung von * Geschäftsanforderungen * zu erhöhen. Andernfalls enden Sie mit einer Reihe von Tests, die nicht nur von geringem Wert sind, sondern auch Sie/andere davon abhalten, die tatsächlich relevanten Tests zu erstellen. Spott ist nur in besonderen Fällen nützlich - darüber hinaus ist es schädlich. –