@Mock注释后,mock实例为null

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.

使用MockitoRule

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)

使用MockitoJUnitRunner

@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;

  • 在上述所有操作都失败之后,这次导入才起作用。谢谢拉姆加洛特 (2认同)

Gan*_*ute 6

对我来说,即使添加@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)注释。


ama*_*tee 5

是什么为我解决了这个问题(结合上面的答案和我自己的补充):

  • MockitoAnnotations.initMocks(this);@Before方法中
  • 测试类必须是公开的
  • 测试方法必须是公开的
  • import org.junit.Test; 代替 import org.junit.jupiter.api.Test;

Test...在 Intellij 中执行 command + N --> 时,它会生成(至少作为默认值)一些在我的情况下不起作用的样板。

  • 非常感谢你救了我。我的问题是你评论的最后一个问题。非常喜欢! (2认同)