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.
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"));
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.
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.
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! !!
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;
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"));
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);
// ...
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.
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