[JAVA] Änderungen in Mockito 2

Über die Änderungen in Mockito 2. Der Inhalt ist für Mockito 1-Benutzer.

Informationen zu Freigaberichtlinien

Freigaberichtlinie geändert wurde am 2017/04 hinzugefügt. Früher wurde es mit jedem Fix veröffentlicht, aber jetzt werden nur die wichtigen Versionen (im Grunde aktualisierte Haupt- / Nebenversionen) vom JCenter / Maven Central Repository bereitgestellt.

Änderungen von Mockito 1

Die wichtigsten Änderungen und zusätzlichen Funktionen werden nachfolgend beschrieben. Weitere Informationen finden Sie unter Wiki, Versionshinweise /blob/release/2.x/doc/release-notes/official.md) und [Mockitos Javadoc](https://javadoc.io/page/org.mockito/mockito-core/latest/org/mockito/ Bitte überprüfen Sie Mockito.html # 0).

Sie können jetzt endgültige Klassen / Methoden verspotten

Mockito 1 erforderte Power Mock, aber ab Mockito 2 ist es möglich, diese zu verspotten, indem der Inline-Mock-Maker aktiviert wird. .. Kotlins Klasse, die schließlich standardmäßig angegeben wird, verwendet auch das kotlin-allopen-Plug-in. Sie können verspotten, ohne es zu benutzen.

Um diese Funktion zu aktivieren, bereiten Sie die folgenden MockMaker-Dateien im Testressourcenverzeichnis vor.

text:app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker


mock-maker-inline

Alternativ können Sie das Mockito-Inline-Artefakt anstelle des Mockito-Kerns angeben.

build.gradle


dependencies {
    //testCompile "org.mockito:mockito-core:+"
    testCompile "org.mockito:mockito-inline:+"
}

Dieses Artefakt ist jedoch nur vorübergehend, bis die Funktion zur Standardeinstellung wird und möglicherweise in Zukunft entfernt wird.

Diese Funktion wird von einem Mock Maker namens InlineByteBuddyMockMaker bereitgestellt, jedoch für diese Klasse @ Incubating .html) Kommentiert. Die Annotation "@ Incubating" wird der neuen API hinzugefügt und zeigt an, dass wir Benutzerfeedback erwarten. Bitte beachten Sie, dass sich die API je nach Feedback ändern kann (obwohl ich denke, dass dies selten der Fall ist).

Beachten Sie, dass das Verspotten statischer Methoden und Konstruktoren nicht unterstützt wird. Wenn Sie sie also verspotten möchten, benötigen Sie weiterhin PowerMock.

Eine Bibliothek für Android-Geräte wurde vorbereitet

Früher war Dexmaker erforderlich, aber Mockito 2.6 bietet jetzt eine Bibliothek für Android-Geräte. Sie können Mockito auf Ihrem Android-Gerät verwenden, indem Sie mockito-android als Bibliothek des Bereichs androidTestCompile angeben.

build.gradle


dependencies {
    androidTestCompile "org.mockito:mockito-android:+"
}

Mit mockito-android können Sie private Paketklassen verspotten, die mit Dexmaker nicht möglich waren.

Beachten Sie, dass Sie mit diesem Artefakt keine endgültigen Klassen / Methoden verspotten können. (Der oben erwähnte Inline-Mock-Maker ist auch nicht mit Android kompatibel.) Obwohl dies meine Arbeit ist, stellen wir eine Bibliothek namens DexOpener zur Verfügung, die das Verspotten der endgültigen Klassen / Methoden auf Android-Terminals realisiert. Bitte versuchen Sie es, wenn Sie möchten.

ArgumentMatcher kann jetzt in Lambda-Ausdrücken geschrieben werden

In Mockito 1 war ArgumentMatcher eine abstrakte Klasse. Nachdem Mockito 2 zu einer Schnittstelle vom Typ SAM geändert wurde, können Sie Lambda-Ausdrücke mit argThat (ArgumentMatcher) verwenden.

any (Class) stimmt nicht mehr mit null überein

any () undany (Class)sind jetzt deutlich getrennte Methoden. any () stimmt mit jedem Argument überein, einschließlich null, aberany (Class)stimmt nicht mit null überein.

Außerdem wurde die Klasse, in der diese Methoden definiert sind, von Matchers in ArgumentMatchers geändert.

Das anyXxx () -System stimmt nicht mehr mit null überein

AnyXxx () -Serien-Matcher wie "anyString ()" und "anyList ()" stimmen nicht mehr mit null überein.

anyObject () / anyVararg () ist veraltet

Mockito 2 verwendet "any ()".

Nullable hinzufügen (Klasse)

"Nullable (Class)" wurde als eine Methode hinzugefügt, die "isA (Class)" sehr ähnlich ist. nullable (Class) entspricht null oder einem Argument des angegebenen Typs, aberisA (Class)stimmt nicht mit null überein.

Die Scheinklasse wird jetzt mit der Zielklasse kommentiert

Zum Beispiel, wenn die Zielklasse ist

@Foo
class Bar { ... }

Die Scheinklasse erhält auch "@ Foo".

Bar mock = mock(Bar.class);
assertTrue(mock.getClass().isAnnotationPresent(Foo.class));

Strenge wurde eingeführt

Ab Mockito 2.3 wurde die Strictness-Klasse eingeführt.

--LENIENT (Mockito 1 Standard, am lockersten) --WARN (Mockito 2 Standard) --STRICT_STUBS (Mockito 3 ist die Standardeinstellung, die härteste)

Es gibt drei Modi: Sie können eine Ausnahme für die Verwendung des Mocks auslösen und eine Hinweisnachricht ausgeben.

Auch für MockitoJUnitRunner

--MockitoJUnitRunner.Silent (entspricht "LENIENT") --MockitoJUnitRunner.Strict (entspricht WARN, entspricht MockitoJUnitRunner) --MockitoJUnitRunner.StrictStubs (entspricht STRICT_STUBS)

Drei Klassen wurden hinzugefügt.

Ein Anwendungsbeispiel ist unten dargestellt.

public class MyTest {

    @Rule
    public MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);

    @Mock
    Foo foo;

    @Test
    public void test() {
        when(foo.bar()).thenReturn("test");
    }

    class Foo {
        String bar() {
            return "";
        }
    }

}

Die obige test () Methode verwendet nicht den in der when -Klausel festgelegten Mock-Satz. Wenn Sie diesen Test ausführen, wird eine UnnecessaryStubbingException ausgelöst.

Wenn Sie "STRICT_STUBS" im obigen Code in "WARN" ändern, tritt kein Fehler auf, aber der folgende Hinweis wird an die Konsole ausgegeben.

[MockitoHint] MyTest.test (see javadoc for MockitoHint):
[MockitoHint] 1. Unused -> at com.example.MyTest.test(MyTest.java:22)

Wenn Sie es in "LENIENT" ändern, tritt kein Fehler auf und es wird keine Nachricht ausgegeben.

Das Mockito-Team [dringend empfohlen], STRICT_STUBS (https://javadoc.io/page/org.mockito/mockito-core/latest/org/mockito/quality/Strictness.html#STRICT_STUBS) zu verwenden ) ist.

Bitte beachten Sie, dass die Strictness-Klasse mit "@ Incubating" versehen ist.

Einführung der Mockito-Sitzung

Ab Mockito 2.7 wird Mockito Session für Umgebungen bereitgestellt, in denen MockitoJUnitRunner / MockitoRule nicht verwendet werden kann. Wenn Sie "MockitoAnnotations # initMocks (Object)" verwenden, um das Modell zu generieren, können Sie es durch MockitoSession ersetzen.

Die Verwendung wird unten gezeigt.

private MockitoSession session;

@Before
public void setUp() {
    session = Mockito.mockitoSession().initMocks(this).startMocking();
}

@After
public void tearDown() {
    session.finishMocking();
}

Wenn Sie die oben genannten Schritte ausführen, wird die Überprüfung gemäß dem Modus der Strenge zum Zeitpunkt von "finishMocking ()" durchgeführt.

Verwenden Sie die Methode "Strenge (Strenge)", um die Strenge zu wechseln.

session = Mockito.mockitoSession()
    .initMocks(this)
    .strictness(Strictness.WARN)
    .startMocking();

Die Standardeinstellung für Strictness ist "STRICT_STUBS". Dies ist ein strengerer Modus als "WARN" in MockitoJUnitRunner / MockitoRule.

Bitte beachten Sie, dass MockitoSession auch mit "@ Incubating" versehen ist.

das ist alles.

Recommended Posts

Änderungen in Mockito 2
Änderungen in mybatis-spring-boot-Starter 2.0
Änderungen im Mybatis-Spring-Boot-Starter 2.1
Änderungen im Mybatis-Spring-Boot-Starter 1.3
Änderungen in Java 11
Änderungen im Mybatis-Spring-Boot-Starter 1.2
Org.mockito.exceptions.misusing.InvalidUseOfMatchersException in Mockito
Änderungen in JUnit5M4-> M5
Änderungen des Kernstandorts in iOS 14
Wichtige Änderungen in Spring Boot 1.5
Verspotten Sie statische Methoden in Mockito 3.4
Java-Versionsnotation, die sich in Java 10 ändert
Versuchen Sie es mit Mockito
Wichtige Änderungen in der Kernfunktionalität von Spring Framework 5.0