Ela*_*da2 50 java junit unit-testing mocking mockito
我尝试运行此测试:
@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);
...
}
Run Code Online (Sandbox Code Playgroud)
但我得到NullPointerException:
Mockito.when(routingClientMock.
我错过了什么?
Rol*_*der 60
如果要使用@Mock注释,则应使用MockitoJUnitRunner
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
@Mock
private IRoutingObjHttpClient routingClientMock;
@Test
public void testSendRoutingRequest() throws Exception {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
另请参阅本教程.
Ste*_*ner 49
您有三个用于激活@Mock注释的选项.恕我直言使用MockitoRule是最好的一个,因为它让你仍然可以选择另一个赛跑者,例如Parameterized.
public class MockitoTest {
@Mock
private IRoutingObjHttpClient routingClientMock;
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Test
public void testSendRoutingRequest() throws Exception {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
@Mock
private IRoutingObjHttpClient routingClientMock;
@Test
public void testSendRoutingRequest() throws Exception {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
明确地调用MockitoAnnotations.initMocks(this).这可以通过qn @Before方法,您自己的跑步者或自己的规则来完成.
public class MockitoTest {
@Mock
private IRoutingObjHttpClient routingClientMock;
@Before
public void createMocks() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testSendRoutingRequest() throws Exception {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
Gje*_*era 36
如果您使用 Junit5,可能会出现同样的问题,因为没有更多的“@RunWith”注释。
在这种情况下,您应该使用以下内容注释您的课程:
@ExtendWith(MockitoExtension.class)
public class MyTestClass {
...
Run Code Online (Sandbox Code Playgroud)
您还应该导入您的依赖项(Maven - pom.xml):
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
Ram*_*rot 17
如果您使用junit.jupiterwith @ExtendWith(MockitoExtension.class)for 测试类但模拟为 null,请确保@Test从
import org.junit.jupiter.api.Test;
Run Code Online (Sandbox Code Playgroud)
代替 org.junit.Test;
对我来说,即使添加@RunWith(MockitoJUnitRunner.class)它也不起作用。
原来,我犯了一个愚蠢的错误,@Test从
import org.junit.jupiter.api.Test;
Run Code Online (Sandbox Code Playgroud)
代替
import org.junit.Test;
Run Code Online (Sandbox Code Playgroud)
改正后,成功了!
小智 6
将@ExtendWith(MockitoExtension.class)注释添加到测试类,并且考虑到您使用的是 Junit 5+ 版本,它应该可以工作。如果您使用旧版本的 Junit,请使用@RunWith(MockitoJUnitRunner.class)注释。
是什么为我解决了这个问题(结合上面的答案和我自己的补充):
MockitoAnnotations.initMocks(this);在@Before方法中import org.junit.Test; 代替 import org.junit.jupiter.api.Test;Test...在 Intellij 中执行 command + N --> 时,它会生成(至少作为默认值)一些在我的情况下不起作用的样板。