[JAVA] Wenn Sie die Testabdeckung privater Methoden in JUnit erfüllen möchten

In Zeiten wie diesen

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.)

Zum Beispiel

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;
}

Wie soll man antworten

Verwenden Sie Mockito https://site.mockito.org/

Vorbereitung

In meinem Fall wurden Spring Boot und JUnit bereits installiert Fügen Sie der Abhängigkeit Folgendes hinzu, um die Bibliothek von Mockito abzurufen.

Bei Verwendung von Maven

<!-- 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>

Wenn Sie Gradle verwenden

dependencies {
  // https://mvnrepository.com/artifact/org.mockito/mockito-all
  testCompile group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
}

Wie benutzt man

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.

Erweiterte Version

Wenn Sie eine private Variable in Ihrem Test abrufen oder festlegen möchten

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.

Schließlich

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

Wenn Sie die Testabdeckung privater Methoden in JUnit erfüllen möchten
Testen Sie private Methoden in JUnit
Testen Sie private Methoden in JUnit
Wenn Sie die übergeordnete Klasse in Lomboks @builder aufnehmen möchten
[Swift] Wenn Sie wissen möchten, ob die Anzahl der Zeichen in String mit einer bestimmten Anzahl übereinstimmt ...
So testen Sie eine private Methode, die ein Array- oder Argument variabler Länge in JUnit verwendet
[RSpec] Wenn Sie die Instanzvariable des Controllers im Test verwenden möchten [Zuweisungen wird nicht empfohlen]
Rufen Sie den Namen des Testfalls in der JUnit-Testklasse ab
Was tun, wenn Sie den Text eines Elements in Selen nicht abrufen können?
Beachten Sie beim Testen privater Methoden in JUnit
Wie man einige Methoden der zu testenden Klasse verspottet
[Java] Testen Sie private Methoden mit JUnit
ProxyFactory ist praktisch, wenn Sie AOP mit Spring testen möchten!
Wenn Sie die Java-Entwicklungsumgebung von Eclipse aus ändern möchten
Rails Private Methoden tun weh, wenn Sie sich genauso fühlen wie Java!
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
Was tun, wenn Sie Ihr Root-Passwort unter CentOS7 vergessen haben?
Wenn Sie Ihre Container nur in der Cloud ausführen möchten, ist Azure Container Instances ganz einfach
Wenn Sie eine Methode in RSpec verspotten möchten, sollten Sie die Methode allow für mock und die Singleton-Methode verwenden.
Ein Memo, wenn Sie den Zeitteil des Kalenders löschen möchten
So filtern Sie den JUnit-Test in Gradle
Wenn Sie Werte dynamisch einbetten und Attributwerten in Thymeleaf 3 Text hinzufügen möchten
So testen Sie den privaten Bereich mit JUnit
Ich möchte, dass Sie Enum # name () für den Schlüssel von SharedPreference verwenden
Möglicherweise möchten Sie die Methode remove in ArrayList nicht sehr oft verwenden
Seien Sie beim Upgrade vorsichtig, wenn Sie | usw. in der Tomcat-URL verwenden
Wenn Sie Android Room verwenden und die Spaltendefinition ändern möchten
Wenn Sie Datenbankspalten usw. ändern möchten.
Wenn Sie InputStream in JDBI3 binden möchten
JUnit 5: Wie man Testfälle in enum schreibt
Ich möchte den Inhalt der Absicht var_dump
Wenn Sie die Methode außerhalb verwenden möchten
Ich möchte den Wert in Ruby erhalten
Was tun, wenn ein Argumentfehler auftritt? Falsche Anzahl von Argumenten (gegeben 2, erwartete 0) in Ihrem RSpec-Test
Auch wenn ich den Inhalt eines Datenobjekts in Java in JSON konvertieren möchte, gibt es einen Zirkelverweis ...
Ich möchte, dass Sie die Geschichte erzählen, dass der Fehler behoben wurde, als Sie das Ladegerät in die Ecke Ihres Kopfes gestochen haben
Wenn Sie SQLite mit VSCode verwenden, verwenden Sie die Erweiterung (wie die Binärdatei von sqlite3 angezeigt wird)
[Rails] After-Option nützlich, wenn Sie die Reihenfolge der DB-Spalten ändern möchten
Was tun, wenn in bind.pry eine falsche Anzahl von Argumenten angezeigt wird?
Für diejenigen, die MySQL für die Datenbank in der Umgebungskonstruktion von Rails6 ~ verwenden möchten.
Wenn Sie an der Position von Gem einen Fehler gemacht haben, löschen Sie Gemfile.lock einmal.
[Active Admin] Ich möchte den Umfang der Sammlung angeben, die in select_box angezeigt werden soll
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
[Java] So lassen Sie den privaten Konstruktor in Lombok weg
Ich möchte eine TraceId in das Protokoll einbetten
Wenn Sie die Spring Boot + Thymeleaf-Verarbeitung trennen möchten
Wenn in Ruby Hash [: a] [: b] [: c] = 0 ist, möchten wir, dass Sie rekursiv erweitern, auch wenn der Schlüssel nicht vorhanden ist
Ich kann kein Japanisch mit VS-Code (Visual Studio Code) von Ubuntu 18.04.5 eingeben! ?? Wenn Sie VS Code auf Ubuntu herunterladen möchten, besuchen Sie die offizielle Website! !!
Testen Sie den Inhalt einer Excel-Datei mit JUnit
Verstehen Sie die Eigenschaften von Scala in 5 Minuten (Einführung in Scala)
Ich möchte die Antwort der Janken-App wissen
Ich möchte den Namen des Posters des Kommentars anzeigen
Wenn Sie Mockito mit Kotlin verwenden möchten, verwenden Sie Mockito-Kotlin