[JAVA] Minimaler Einsatz von Mockito

Einführung

Ich habe mich für ** JUnit + Mockito + PowerMock ** in dem Projekt entschieden, an dem ich gerade arbeite. Erstens ist mir alles unbekannt, was JUnit selbst noch nie berührt hat.

Selbst wenn Sie gg mit "** Mockito **" versuchen, gibt es nur wenige Artikel, die erklären, dass Leute ohne Wissen es sofort verwenden können. Oder besser gesagt ** Ich habe nicht viel Japanisch! ** **. Ohne Erklärung auf Japanisch ist es schwer zu verstehen. ..

Also schreibe ich diesen Artikel für mich, der nichts wusste, weil ich kürzlich endlich ein bisschen geschluckt habe.

Diesmal ist ** Mockito ** Edition.

Insbesondere werde ich über den Fall schreiben, in dem Sie eine Methode einer Klasse verspotten möchten, die sich von der zu testenden Klasse unterscheidet.

Was Mockito nicht kann

Erstens gibt es viele Dinge, die Mockito nicht kann. Es ist nicht allzweckmäßig und es gibt nur eine begrenzte Anzahl von Methoden, die verspottet werden können. Ich kann es nicht verspotten

Dies sind die oben genannten vier Typen. (Vielleicht) Ich denke auch, dass abstrakte Klassen nicht verspottet werden konnten. (Vielleicht)

Ansonsten können Sie es grundsätzlich mit mockito (vielleicht) verspotten. Um die obigen vier zu verspotten, müssen Sie "PowerMock" getrennt von Mockito verwenden.

Verspotten Sie die Klasse mit der Methode, die Sie aufrufen möchten

Um eine verspottete Methode aufzurufen, verspotten Sie zunächst die Klasse. Es gibt ** 2 Arten von Verspottungsmethoden **. Nur einer von ihnen ist in Ordnung.

** ① Direkt unter der Klasse @ Mock ** ** ② Verwenden Sie die mock () Methode **

Java



public class TestClass {
  //① Direkt unter der Klasse@Deklaration der Scheininstanz in Mock
  @Mock
  private Entity entity; //Dies ist nur eine Deklaration, es wird kein Scheinobjekt erstellt
  
  @Test
  public void test001() {
     // ② mock()Verwenden Sie die Methode
    Entity entity = mock(Entity.class); //Dies allein erzeugt ein Scheinobjekt
  }
}

Im Fall von ** ① ** muss diese getrennt von dieser Deklaration initialisiert werden. ** ② ** verspotten Sie die Klasse jedes Mal in der Testklasse. Es muss nicht initialisiert werden.

Scheininitialisierung

Im Fall von @ Mock von ** ① ** wurde das Scheinobjekt noch nicht erstellt, daher muss ** initialisiert ** werden.

Java



public class class() {
  // @Scheinmuster
  @Mock
  private ResultEntity entity;
  
  @Before // @Vor Annotation hinzufügen und jede Testmethode vor der Ausführung ausführen.
  private void initMocks() {
    MockitoAnnotations.initMocks(this); //Initialisierungsmagie
  }
}

Ich denke, die ** ① ** Methode ist effektiv, wenn ** es mehrere Testfälle gibt und die Klasse, die Sie verspotten möchten, viele Male erscheint **.

Injizieren Sie Mock in die zu testende Klasse

Verwenden Sie die Annotation @ InjectMocks, um einen Mock in die zu testende Klasse direkt unter der Testklasse einzufügen.

public class TestClass {
  @Mock
  Entity entity; //Verspottete Klasse

  @InjectMocks
  Human human; //Injizieren Sie Mock in die zu testende Klasse
}

Derzeit ist es möglich, es zu verspotten und dann zu testen. Wenn Sie eine Abdeckung erhalten, ** beträgt diese nicht 100%, es sei denn, die Instanz der zu testenden Klasse heißt **. Wenn Sie also die Abdeckung auf 100% setzen möchten.

   @InjectMocks
  Human human = new Human();

Es ist okay, so zu schreiben.

Nachdem wir die Klasse verspottet haben, werden wir die Methode für jeden der folgenden Fälle tatsächlich verspotten.

Für öffentliche Methoden mit einem Rückgabewert

public String etc. In diesem Fall gibt es ~~ warum ~~ ** 2 Arten **, wie man die Methode verspottet.

1. dann Methode

Mockito.when(Scheininstanz).Methode(Willkürliches Argument).thenReturn(Beliebiger Rückgabewert);
//Gibt diese Rückgabe zurück, wenn die Methode der verspotteten Klasse aufgerufen wird

Die Methode wird jetzt verspottet, und die Methode wird nicht tatsächlich ausgeführt und ist nur eine Verspottung, die einen beliebigen Rückgabewert zurückgibt.

Übrigens kann der "Mockito" im Kopf mit oder ohne sein. Da PowerMock auf die gleiche Weise geschrieben ist, ** ist es notwendig, es richtig zu verwenden, wenn es gleichzeitig verwendet wird **, daher denke ich, dass es leichter zu verstehen ist, wenn Sie es in Ihren Kopf stecken.

2. Methode machen

Mockito.doReturn(Beliebiger Rückgabewert).when(Scheininstanz).Methode(Willkürliches Argument);
//Ich werde diesen Rückgabewert zurückgeben, wenn die Methode der verspotteten Klasse aufgerufen wird

Sowohl ① als auch ② verhalten sich genau gleich. Wie unten erläutert, ist die ** dann-Methode möglicherweise nicht in der Lage, damit umzugehen **. Es scheint also, dass kein Fehler vorliegt, wenn Sie sie mit der do-Methode vereinheitlichen.

Für öffentliche ungültige Methoden ohne Rückgabewert

public void In diesem Fall kann es nur mit der ** do-Methode ** beschrieben werden.

Mockito.doNothing().when(Scheininstanz).Methode(Willkürliches Argument);
//Es wird nichts zurückgegeben, wenn eine Scheinklassenmethode aufgerufen wird

Es scheint keine Methode namens thenNothing () zu geben.

Überprüfen Sie die Argumente der verspotteten Methode (ArgumentCaptor).

Da die Methode verspottet wurde, muss sie nicht überprüft werden, aber ich denke, es muss überprüft werden, ob die an die verspottete ** Methode übergebenen Argumente korrekt sind **.

In einem solchen Fall können Sie "ArgumentCaptor" verwenden.

ArgumentCaptor<Schimmel>Variable= ArgumentCaptor.forClass(Schimmel.class);
// forClass()Erstellen Sie einen Container (eine Variable) dieses Typs mit einer Methode

Capture () -Methode

Wenn Sie die obige Variable beim Verspotten einer Methode als Argument übergeben, wird das tatsächlich übergebene Argument erfasst und in der Variablen gespeichert. Fügen Sie zu diesem Zeitpunkt die Methode 'capture ()' hinzu.

Mockito.doReturn("Rückgabewert").when(Klasse).Methode(Variable.capture());
// forClass()Erstellen Sie einen Container (eine Variable) dieses Typs mit einer Methode

Die Variable enthält jetzt die in der tatsächlichen Quelle übergebenen Argumente.

Erfassung gespeicherter Erfassungsinformationen

Variable.getValue(); // ①
Variable.getAllValues().get(index); // ②

Mit einer dieser Methoden können Sie den Wert entsprechend dem Typ der Variablen abrufen.

** ① ** Wenn Sie nur ein Argument überprüfen möchten, können Sie die von der Methode getValue () gespeicherten Informationen abrufen.

** ② ** ArgumentCaptor kann viele Male an ** Argumente übergeben werden und so viele Ergebnisse speichern, wie Argumente vorhanden sind **. (Nur für den gleichen Typ.)

In diesem Fall wird es in Form eines Arrays gespeichert. Rufen Sie daher alle Werte mit der Methode getAllValues () ab. Sie können den Wert eines von ihnen mit get (index) abrufen.

Wenn Sie die Variablen wiederverwenden, ist es tatsächlich schwierig zu bestimmen, welche Nummer zu welchem Argument gehört. Deklarieren Sie also im Grunde ** den Inhalt von ArgumentCaptor so viele wie die Anzahl der Argumente ** Ich denke, es ist besser, es zu tun.

ArgumentCaptor<String> str = ArgumentCaptor.forClass(String.class);
Mockito.doReturn("Rückgabewert").when(Class).getStr(str.capture());
assertTaht(str.getValue(), is(Erwarteter Wert des Arguments));

Ich denke, es wird so aussehen.

Überprüfen Sie die Anzahl der verspotteten Methodenaufrufe

Wenn Sie eine Methode verspotten, wird sie tatsächlich nicht aufgerufen. Daher müssen Sie möglicherweise ** überprüfen, ob die verspottete Methode ordnungsgemäß aufgerufen wird **.

Zu diesem Zeitpunkt wird die Methode "verify ()" verwendet.

Mockito.verify(Scheininstanz, times(index)).Scheinmethode(Streit);

Sie können überprüfen, wie oft die Methode aufgerufen wurde, indem Sie den erwarteten Wert als Scheininstanz als erstes Argument der Methode "verify ()", die Methode "times ()" als zweites Argument und int als Argument übergeben.

Methoden ohne Rückgabewert können nur mit verify () verspottet werden

Was meinst du

Das Verspotten einer Methode ohne Rückgabewert erfolgt wie unter [Für eine öffentliche void-Methode ohne Rückgabewert](# Für eine öffentliche void-Methode ohne Rückgabewert) beschrieben.

Wenn Sie die Anzahl der Methodenaufrufe überprüfen möchten, müssen Sie nicht sowohl "doNothing ()" als auch "verify ()" ausführen. Sie können beide gleichzeitig mit nur ** "verify ()" ausführen. ** **.

Anstatt es gleichzeitig zu tun, bedeutet dies, dass es zum Zeitpunkt von ** verify () ** als Methode ohne Rückgabewert verspottet wurde.

Beachten Sie jedoch, dass ** eine Methode mit einem Rückgabewert nicht mit verify () ** verspottet werden kann.

Dies liegt daran, dass verify () ** den Rückgabewert ** nicht verspotten kann.

// doNothing()Auch wenn Sie nicht verspotten, ist dies in Ordnung
Mockito.verify(Scheininstanz, times(index)).Scheinmethode();

Übrigens im obigen Fall +, wenn Sie das Argument überprüfen möchten

// doNothing()Auch wenn Sie nicht verspotten, ist dies in Ordnung
Mockito.verify(Scheininstanz, times(index)).Scheinmethode(Variable.capture());

Auf diese Weise kann das Argument auch zu diesem Zeitpunkt gespeichert werden.

Schließlich

Wenn Sie sich an diese erinnern, werden Sie wahrscheinlich bis zu einem gewissen Grad kämpfen können. Ich habe vor, in Zukunft Verspottungen über andere Methoden derselben Klasse und Verspottungen über neue Methoden zu schreiben.

Referenz

[Java] Wie man Mockito trinkt (Einführung)

Recommended Posts

Minimaler Einsatz von Mockito
[Java] Mirage-Basic-Verwendung von SQL
Super grundlegende Verwendung von Eclipse
Validierung von Protokollnachrichten mit mockito
Grundlegende Verwendung von Java Optionaler Teil 1
Ordnungsgemäße Verwendung von Mockito und PowerMock
[Rails] Unterschiede und Verwendung von each_with_index und each.with_index
Von der Einführung bis zur Verwendung von byebug
[Spezifische Verwendung von before_action] Rails-Refactoring
Grundlegende Verwendung und Codebeispiel für Enum
Wie man Colaboratory für eine Minute anders benutzt (versuchen Sie es mit Kotlin)
[Ruby] Schleifenunterscheidung und Verwendung in Ruby
Einführung und Verwendungserklärung von Font Awesome