[JAVA] [Mockito] 3.2.4 → Nach dem Update auf 3.3.x ist ein Fehler aufgetreten (obwohl Iketenai)

Nach dem Update von Mockito 3.2.4 auf 3.3.x (3.3.3) ... Ist der Code, der den Stub festlegt, redundant? Ich habe deshalb einen Fehler bekommen.

Was war das für ein Code?

Es war so ein Code.

when(rs.getInt("column")).thenReturn(100);		
assertEquals(Integer.valueOf(100), TYPE_HANDLER.getResult(rs, "column"));
		
when(rs.getInt("column")).thenReturn(0);
assertEquals(Integer.valueOf(0), TYPE_HANDLER.getResult(rs, "column"));

Was für einen Fehler hast du bekommen?

Dies ist der Fehler.

org.mockito.exceptions.misusing.UnnecessaryStubbingException: 
Unnecessary stubbings detected.
Clean & maintainable test code requires zero unnecessary code.
There are 1 unnecessary stubbing (click to navigate to relevant line of code):
  1. -> at org.apache.ibatis.type.YearTypeHandlerTest.shouldGetResultFromResultSetByName(YearTypeHandlerTest.java:44)
Please remove unnecessary stubbings or use 'lenient' strictness. More info: javadoc for UnnecessaryStubbingException class.

Was ist cool?

Anscheinend ... thenReturn scheint cool zu sein, und der Fehler ist durch die folgenden Schritte verschwunden.

when(rs.getInt("column")).thenReturn(100, 0); //An einem Ort konsolidieren! !!
assertEquals(Integer.valueOf(100), TYPE_HANDLER.getResult(rs, "column"));
assertEquals(Integer.valueOf(0), TYPE_HANDLER.getResult(rs, "column"));

Nun ... es ist so.

Muss ich den Code korrigieren?

Wenn Sie keine klare Absicht haben, sollten Sie den Code grundsätzlich korrigieren. Sie können diesen Fehler jedoch unterdrücken, indem Sie ihn wie in der Fehlermeldung beschrieben in den "milden" Modus versetzen. Hier sind einige Möglichkeiten, dies zu verhindern.

NOTE:

Es ist eine Abschreckung, die ich bei einer schnellen Suche gefunden habe, also gibt es möglicherweise andere bessere Möglichkeiten! !!

Verwenden des Attributs "lenient" von "@ Mock"

Wenn ein Scheinobjekt mithilfe einer Anmerkung erstellt wird, kann es durch Angabe des Attributs der Anmerkung unterdrückt werden.

// @Mock
@Mock(lenient = true)
protected ResultSet rs;

Verwenden Sie MockSettings # lenient ()

Wenn ein Scheinobjekt mit der Methode "Mockito # mock" erstellt wird, kann es durch Angabe der Option der Methode unterdrückt werden.

// ResultSet rs = mock(ResultSet.class);
ResultSet rs = mock(ResultSet.class, withSettings().lenient());
when(rs.getInt("column")).thenReturn(INSTANT.getValue());
assertEquals(INSTANT, TYPE_HANDLER.getResult(rs, "column"));
when(rs.getInt("column")).thenReturn(0);
assertEquals(Year.of(0), TYPE_HANDLER.getResult(rs, "column"));

Verwenden von Mockito.lenient ()

Sie können Mockito.lenient () verwenden, um es zu unterdrücken, aber es ist besser, es zu beheben, als es auf diese Weise zu unterdrücken.

// when(rs.getInt("column")).thenReturn(100);
lenient().when(rs.getInt("column")).thenReturn(100);
// ...

JUnit 5: Verwenden des Attributs strictness von @ MockitoSettings

Wenn Sie JUnit 5 (MockitoExtension) verwenden, können Sie dies unterdrücken, indem Sie das Attribut der Annotation @ MockitoSettings angeben. Diese Einstellung scheint für den Teil zu gelten, der die Mockito # mock-Methode verwendet.

@MockitoSettings(strictness = Strictness.LENIENT) //Füge das hinzu
@ExtendWith(MockitoExtension.class)
abstract class BaseTypeHandlerTest {
  // ...
  @Mock
  protected PreparedStatement ps;
  // ...
}

NOTE:

Obwohl in diesem Eintrag nicht erwähnt, scheint JUnit 4 ähnliche Optionen zu haben.

Zusammenfassung

Mickito ist eine sehr nützliche Bibliothek, um die Annahmen für Unit-Tests vorzubereiten. Wenn Sie jedoch den Code nicht sauber halten, sieht es in der Regel so aus: "Was machen Sie?" Also ... ich bin dankbar für diese Art von Überprüfungsmechanismus (manchmal weiß ich nicht, wie ich das beheben soll ...: heat_smile :). Der Berichtsinhalt der Bibliothek ist jedoch nicht immer korrekt. Es empfiehlt sich daher, den Berichtsinhalt und den Code zu überprüfen und gegebenenfalls den Modus "Nachsichtig" zu verwenden.

Recommended Posts

[Mockito] 3.2.4 → Nach dem Update auf 3.3.x ist ein Fehler aufgetreten (obwohl Iketenai)
Ich habe in RSpec den Fehler "undefined method` create '" erhalten
Beim Verschlüsseln mit Node + Docker wurde eine Fehlermeldung angezeigt
Bei der Verwendung von nextInt, nextLine und substring ist ein Fehler aufgetreten.
Ich habe einen Fehler bekommen! * Es gibt keine interaktive Anforderungsvorlage
Heroku kann bereitgestellt werden, aber ich erhalte eine Fehlermeldung und kann sie nicht öffnen
Ich habe mit Vagrant eine CentOS 8-Umgebung erstellt und versucht, den Ordner zu synchronisieren, aber ich habe einen Fehler erhalten, also habe ich ihn behoben.
Beim Hinzufügen einer Abhängigkeit wird eine Fehlermeldung angezeigt
Beim Versuch, sbt zu installieren, um eine Scala-Entwicklungsumgebung zu erstellen, ist ein Fehler aufgetreten
[Docker] Als ich Docker-Compose Build erstellt habe, wurde die Fehlermeldung "Datei kann nicht gelesen werden" angezeigt. .. [Rails 6.0]
Ich kann auf Heroku bereitstellen, erhalte jedoch eine Fehlermeldung und kann sie nicht öffnen. [Ursache: MySQL]
Auf Jetson Nano habe ich versucht, xxx.whl mit Dockerfile zu installieren, aber es ist ein Fehler aufgetreten (xxx.whl ist auf dieser Plattform kein unterstütztes Rad.)