@Mock注释后,mock实例为null

时间:2015-04-12 14:37:56

标签: java unit-testing junit 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);

...
    }

但是我得到了NullPointerException:

Mockito.when(routingClientMock.

我错过了什么?

15 个答案:

答案 0 :(得分:49)

如果您想使用@Mock注释,则应使用MockitoJUnitRunner

@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

    @Mock
    private IRoutingObjHttpClient routingClientMock;

    @Test
    public void testSendRoutingRequest() throws Exception {
        // ...
    }

}

另见this tutorial

答案 1 :(得分:42)

您有三个选项可用于激活@Mock注释。使用MockitoRule的恕我直言是最好的一个,因为它让你仍然可以选择其他跑步者,例如Parameterized

使用MockitoRule

public class MockitoTest {

  @Mock
  private IRoutingObjHttpClient routingClientMock;

  @Rule
  public MockitoRule rule = MockitoJUnit.rule();

  @Test
  public void testSendRoutingRequest() throws Exception {
    // ...
  }
}

使用MockitoJUnitRunner

@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

  @Mock
  private IRoutingObjHttpClient routingClientMock;

  @Test
  public void testSendRoutingRequest() throws Exception {
    // ...
  }
}

明确致电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 {
    // ...
  }
}

答案 2 :(得分:4)

对我来说,即使添加了@RunWith(MockitoJUnitRunner.class),它也不起作用。
原来,我犯了一个愚蠢的错误:从

导入@Test
import org.junit.jupiter.api.Test;

代替

import org.junit.Test;

更正后,就可以了!

答案 3 :(得分:2)

它也可能是导入问题,因此请确保您拥有相应的导入包。

例如," org.easymock"包也有一个名为@Mock的注释,当然,它不会与Mockito特定的设置一起使用。

答案 4 :(得分:1)

  1. 您应该在课堂上使用@RunWith(SpringJUnit4ClassRunner.class)
  2. 您必须在@Before方法
  3. 中致电MockitoAnnotations.initMocks(this);

答案 5 :(得分:1)

尝试检查您调用的方法是否为最终方法。

Mockito不能嘲笑最后的方法。 https://github.com/mockito/mockito/wiki/FAQ

答案 6 :(得分:0)

如果您将junit.jupiter@ExtendWith(MockitoExtension.class)一起用于测试课程,但模拟项为空,请确保从{p1>导入了@Test批注

import org.junit.jupiter.api.Test;

代替org.junit.Test;

答案 7 :(得分:0)

如果使用Junit5,由于没有更多的'@RunWith'注释,可能会发生相同的问题。

在这种情况下,您应该使用以下代码注释课程:

@ExtendWith(MockitoExtension.class)
public class MyTestClass {
...

您还应该导入依赖项(Maven-pom.xml):

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>${mockito.version}</version>
    <scope>test</scope>
</dependency>

答案 8 :(得分:0)

对我来说,将注释添加到课程中

@RunWith(MockitoJUnitRunner.class)

并修改Mockito的版本可以解决此问题。

<dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>2.23.4</version>
        <scope>test</scope>
</dependency>

答案 9 :(得分:0)

是什么为我解决了这个问题(上述答案和我自己添加的内容的结合):

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

在Intellij中执行命令+ N-> Test...时,它将生成(至少默认情况下)在我的情况下不起作用的样板。

答案 10 :(得分:0)

我遇到了同样的问题,但是我发现将我的测试(该测试最初是为JUnit 3编写的,并使用了遗留的setUp()tearDown()方法)更新为JUnit 4,并且现代的注解夹具方法也可以使用。

此外,如果您使用的是规则:

@Rule public MockitoRule rule = MockitoJUnit.rule();

确保规则也是公开课程,否则您将收到消息:

How did getFields return a field we couldn't access?

答案 11 :(得分:0)

对我来说,当我添加:

  1. 在班级层面:
@RunWith(MockitoJUnitRunner.class).
  1. 课内:
@Before
      public void createMocks() {
        MockitoAnnotations.initMocks(this);
      }

答案 12 :(得分:0)

向测试类添加 @ExtendWith(MockitoExtension.class) 注释,鉴于您使用的是 Junit 5+ 版本,它应该可以工作。 如果您使用的是旧版 Junit,请使用 @RunWith(MockitoJUnitRunner.class) 注释。

答案 13 :(得分:0)

我的问题是我声明了 @Mock MyClass myClass 然后试图在我的 @BeforeAll 注释方法中模拟一个行为:

@Mock
private MyClass myClass;

...

@BeforeAll
public void init()
{
    ...
    Mockito.when(myClass.something()).thenReturn("Not found")
    ...
}

显然 init() 是在 myClass 的模拟初始化之前执行的,所以 init() 中的 myClass == null。

解决方案是将注解从@BeforeAll 改为@BeforeEach。

答案 14 :(得分:-1)

如果您还在使用PowerMock,那么

@RunWith(MockitoJUnitRunner.class)

可以替换为

@RunWith(PowerMockRunner.class)

这将激活您的@Mocks并启用PowerMock功能。