Ich versuche diesen Test auszuführen:
@Mock IRoutingObjHttpClient routingClientMock;
@Mock IRoutingResponseRepository routingResponseRepositoryMock;
@Test
public void testSendRoutingRequest() throws Exception {
CompleteRoutingResponse completeRoutingResponse = new CompleteRoutingResponse();
completeRoutingResponse.regression_latencyMillis = 500L;
Mockito.when(routingClientMock.sendRoutingRequest(any(RoutingRequest.class))).thenReturn(completeRoutingResponse);
RoutingObjHttpClientWithReRun routingObjHttpClientWithReRun = new RoutingObjHttpClientWithReRun
(routingClientMock, routingResponseRepositoryMock);
...
}
aber ich bekomme NullPointerException für:
Mockito.when(routingClientMock.
Was vermisse ich?
MockitoAnnotations.initMocks(this)
? (Sollte sich wahrscheinlich in der @ Vor-Methode befinden.) Oder haben Sie eine andere @ Regel, mit der Sie Ihre Mocks initialisieren möchten? (Es ist nicht automagisch)routingClientMock
zBroutingClientMock = Mockito.mock(RoutingObjHtttpClient.class);
@RunWith(MockitoJUnitRunner.class)
in Ihrer Klasse verwendenAntworten:
Wenn Sie die
@Mock
Anmerkung verwenden möchten, sollten Sie die verwendenMockitoJUnitRunner
@RunWith(MockitoJUnitRunner.class) public class MockitoTest { @Mock private IRoutingObjHttpClient routingClientMock; @Test public void testSendRoutingRequest() throws Exception { // ... } }
Siehe auch dieses Tutorial .
quelle
Sie haben drei Möglichkeiten, um die
@Mock
Annotation zu aktivieren : MockitoRule, MockitoJUnitRunner, MockitoAnnotations.initMocks (this). IMHO mit derMockitoRule
ist die beste, weil Sie damit immer noch einen anderen Läufer wie zParameterized
.Verwenden Sie die MockitoRule
public class MockitoTest { @Mock private IRoutingObjHttpClient routingClientMock; @Rule public MockitoRule rule = MockitoJUnit.rule(); @Test public void testSendRoutingRequest() throws Exception { // ... } }
Verwenden Sie den MockitoJUnitRunner
@RunWith(MockitoJUnitRunner.class) public class MockitoTest { @Mock private IRoutingObjHttpClient routingClientMock; @Test public void testSendRoutingRequest() throws Exception { // ... } }
Rufen Sie MockitoAnnotations.initMocks (this) explizit auf.
Dies kann in der qn-
@Before
Methode, in Ihrem eigenen Läufer oder in einer eigenen Regel erfolgen.public class MockitoTest { @Mock private IRoutingObjHttpClient routingClientMock; @Before public void createMocks() { MockitoAnnotations.initMocks(this); } @Test public void testSendRoutingRequest() throws Exception { // ... } }
quelle
Das gleiche Problem kann auftreten, wenn Sie Junit5 verwenden, da keine Annotation '@RunWith' mehr vorhanden ist.
In diesem Fall sollten Sie Ihre Klasse mit folgenden Anmerkungen versehen:
@ExtendWith(MockitoExtension.class) public class MyTestClass { ...
Sie sollten auch in Ihre Abhängigkeit importieren (Maven - pom.xml):
quelle
Wenn Sie
junit.jupiter
mit@ExtendWith(MockitoExtension.class)
für Testklasse aber Mocks sind null , stellen Sie sicher , dass@Test
Annotation von importiertimport org.junit.jupiter.api.Test;
Anstatt von
org.junit.Test;
quelle
Dies kann auch ein Importproblem sein. Stellen Sie daher sicher, dass Sie über das entsprechende importierte Paket verfügen.
Zum Beispiel hat das "org.easymock" -Paket auch eine Anmerkung namens @Mock, die natürlich nicht mit Mockito-spezifischen Setups funktioniert.
quelle
Für mich hat es auch nach dem Hinzufügen
@RunWith(MockitoJUnitRunner.class)
nicht funktioniert.Es stellte sich heraus, hatte ich den dummen Fehler des Imports aus
@Test
ausimport org.junit.jupiter.api.Test;
Anstatt von
import org.junit.Test;
Nach der Korrektur hat es funktioniert!
quelle
@RunWith(SpringJUnit4ClassRunner.class)
in Ihrer Klasse verwendenMockitoAnnotations.initMocks(this);
@ Before-Methode aufrufenquelle
@RunWith(SpringJUnit4ClassRunner.class)
nichtMockitoJUnitRunner.class
?Versuchen Sie zu überprüfen, ob die von Ihnen aufgerufene Methode endgültig ist Methode Methode ist oder nicht.
Mockito kann die endgültige Methode nicht verspotten. https://github.com/mockito/mockito/wiki/FAQ
quelle
Was hat dieses Problem für mich gelöst (Kombination der obigen Antworten und meiner eigenen Ergänzungen):
MockitoAnnotations.initMocks(this);
in dem@Before
Methodeimport org.junit.Test;
Anstatt vonimport org.junit.jupiter.api.Test;
Wenn Sie Befehl + N ->
Test...
in Intellij ausführen, wird (zumindest standardmäßig) ein Boilerplate generiert, das in meinem Fall nicht funktioniert hat.quelle
Für mich Hinzufügen der Anmerkung zur Klasse:
@RunWith(MockitoJUnitRunner.class)
Durch Ändern der Version von Mockito wurde dieses Problem behoben.
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.23.4</version> <scope>test</scope> </dependency>
quelle
Ich hatte das gleiche Problem, fand jedoch eine Aktualisierung meiner Tests (die ursprünglich für JUnit 3 geschrieben wurden und das Legacy
setUp()
und verwendetentearDown()
Methoden verwendeten) auf JUnit 4 funktionierte und moderne kommentierte Fixture-Methoden funktionierten.Wenn Sie außerdem die Regel verwenden:
@Rule public MockitoRule rule = MockitoJUnit.rule();
Stellen Sie sicher, dass sich die Regel auch in einer öffentlichen Klasse befindet. Andernfalls erhalten Sie die folgende Nachricht:
How did getFields return a field we couldn't access?
quelle
Wenn Sie dann auch PowerMock verwenden
@RunWith(MockitoJUnitRunner.class)
kann durch ersetzt werden
@RunWith(PowerMockRunner.class)
Dadurch wird Ihre aktiviert
@Mocks
und die PowerMock-Funktionalität aktiviert .quelle