当我想测试一个复杂的方法时,mockito会存储操作吗?

时间:2014-11-30 20:59:13

标签: java unit-testing mockito

我是simito的新手。这是一个简单而酷的框架(它让我爱测试:))。

我正在测试一种复杂的方法:    在此方法中,仅在数据更改时才调用服务。

public void testMyFacadeMethod() {   
    .... 
    If (dataChanged) {
        myService.callServiceMethod();
    }
}

在我的测试方法中:我准备我的模拟然后我更改数据,然后调用

verify(myService).callServiceMethod();

一切都好,我的测试通过了。 在同一个测试方法中,我记得我的facadeMethod,所以不能调用myService.callServiceMethod(因为我的数据不会改变)。 测试失败:

verify(myService).callServiceMethod();
myFacadeMethod() <== tested method
verify(myService, times(0)).callServiceMethod(); <= tell me that this method is called once

我的问题是:mockito存储方法被调用的次数,直到此行?所以第一次通话不会重置计数器?

对我来说,验证方法的第二次调用只计算第一次验证后的呼叫次数(我知道生活变得复杂了:p)

谢谢你,对不起我的英语。

您是否推荐任何测试电子书来学习测试的艺术?

2 个答案:

答案 0 :(得分:2)

是的,Mockito不会自动重置方法调用次数。 您可以使用Mockito.reset(T)重置模拟。

但是,您应该尽量避免使用该方法。如果测试代码是智能的并且因此其存在可能指示代码气味通常是不必要的。看到 http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#17

答案 1 :(得分:1)

您可以使用Mockito.reset重置模拟。但是,最好更改测试的设计。你应该有两个独立的测试,每个测试一个,你应该在每次测试之前创建新的模拟。

这样的事情:

@Before
public void setup() {
    // create a myService mock
}

@Test
public void testMyFacadeMethodWithDataChange() {
    // change data, call tested method
    verify(myService).callServiceMethod();
}

@Test
public void testMyFacadeMethodWithoutDataChange() {
    // no data change, call tested method
    verify(myService, times(0)).callServiceMethod();
}