2015-04-12 68 views
14

我尝试运行这个测试后空:模拟实例@Mock注释

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

我失去了什么?

+1

你叫'MockitoAnnotations.initMocks(this)'? (应该可能在@Before方法)或者,你有没有其他@Rule你期望初始化你的模拟? (它不是自动的) –

+0

你需要实例化'routingClientMock'例如'routingClientMock = Mockito.mock(RoutingObjHtttpClient.class);' –

+0

你也可以使用'@RunWith(MockitoJUnitRunner。class)'在你的课 –

回答

21

当你想使用@Mock注释,你应该使用MockitoJUnitRunner

@RunWith(MockitoJUnitRunner.class) 
public class MockitoTest { 

    @Mock 
    private IRoutingObjHttpClient routingClientMock; 

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

} 

另请参阅this tutorial

+0

它不工作对我来说总是给这个错误“dexcache == null(并且没有默认可以被发现;考虑设置'dexmaker.dexcache'系统属性)” – pyus13

+0

@ pyus13这应该是一个新的问题与更多的代码。 –

+0

欣赏响应,我认为问题是我在JUnit Test中使用它,而一些代码合并了团队中的某个人错误地添加了dex maker testImplementation依赖关系。从build.gradle中删除该行后,事情开始工作。谢谢,希望这会节省一些人的时间。 – pyus13

0
  1. 你应该在你的类
  2. 使用@RunWith(SpringJUnit4ClassRunner.class)你必须调用MockitoAnnotations.initMocks(this);在@Before方法
+0

为什么'@RunWith(SpringJUnit4ClassRunner.class)'而不是'MockitoJUnitRunner.class'? –

19

您有三个选项用于激活@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 { 
    // ... 
    } 
} 
+1

这是最完整的答案! –

-1

如果您还使用PowerMock然后

@RunWith(MockitoJUnitRunner.class) 

可以

@RunWith(PowerMockRunner.class) 

更换这将激活你的@Mocks并启用PowerMock功能。

0

它也可能是一个导入问题,所以请确保您有适当的导入包。

例如,“org.easymock”软件包也有一个名为@Mock的注释,当然,这不适用于Mockito特定的设置。