Ich möchte wirklich, dass JUnit eine 100% ige Abdeckung hat, einschließlich privater Methoden! (Grundsätzlich ist es natürlicher, den öffentlichen Methodentest zu bestehen.)
Angenommen, es gibt eine private Methode in der folgenden Klasse, die den Test nicht an nur einer Stelle auf natürliche Weise bestehen kann. (Es ist süß, dass der Inhalt matschig ist)
private String getStatus(String param, TestEntity testEntity) {
String result = null;
switch (param) {
case "1":
result = "A" + testEntity.getCode();
break;
case "2":
result = "B" + testEntity.getCode();
break;
case "3":
result = "C" + testEntity.getCode();
break;
default :
result = "Z" + testEntity.getCode (); // ← Die Abdeckung hier wird nicht bestanden!
}
return result;
}
Verwenden Sie Mockito https://site.mockito.org/
In meinem Fall wurden Spring Boot und JUnit bereits installiert Fügen Sie der Abhängigkeit Folgendes hinzu, um die Bibliothek von Mockito abzurufen.
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
dependencies {
// https://mvnrepository.com/artifact/org.mockito/mockito-all
testCompile group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
}
Schreiben Sie einfach Folgendes in die Testklasse
private SampleUtil sampleUtil;
private static int testId = 1; // Variablen, die bei der späteren Überprüfung verwendet werden
@Test
public void getStatus() {
// Setze, um SampleUtil # getStatus ausführen zu können
Method method = SampleUtil.class.getDeclaredMethod("getStatus", String.class, TestEntity.class);
method.setAccessible(true);
// Parametereinstellungen zum Testen
String param = "4";
TestEntity testEntity = new TestEntity();
testEntity.setCode("001");
// Testlauf
String status = (String) method.invoke(sampleUtil, param, testEntity);
assertThat(status, is("Z001"));
}
Durch Setzen von barrierefrei = wahr für die Methode getStatus () von SampleUtil kann sie ohne Ignorieren der Zugriffsebene aufgerufen werden.
Die folgende testId ist eine Variable, die privat in SampleUtil.java definiert ist. Lass es uns hier bekommen.
@Test
public void getParams() {
SampleUtil sampleUtil = new SampleUtil();
assertThat(Whitebox.getInternalState(sampleUtil, "testId"), is(1));
}
Durch diese Implementierung ist es möglich, einen Anruf zu tätigen, während die Zugriffsebene ignoriert wird.
Zusätzlich zu den hier vorgestellten Funktionen verfügt es über viele Funktionen wie das Umschreiben statischer Methoden und das Erweitern des Bereichs von JUnit-Tests. Wenn Sie interessiert sind, können Sie es sich ansehen.
Recommended Posts