我有一个像下面这样的方法
public void init() {
String message = getApplication().getString(R.string.empty_message_with_user,user.getUsername());
emptyMessageText = new ObservableField<>(message);
}
我测试了这种方法如下
@Test
public void init_isCalled() {
MyClass myClass = mock(MyClass.class);
doNothing().when(myClass).init();
myClass.init();
verify(myClass, times(1)).init();
}
上面的测试运行正常,但问题是当我查看覆盖率报告时,它表明该方法未被测试覆盖,我使用jacoco生成覆盖率报告。
当你创建一个从另一个方法调用的测试时,你可以模拟init
方法。
但是如果你想测试init
方法本身(并获得它的覆盖范围),你不需要模拟它。只需从您的测试中调用它。反过来,如果需要,你可以模拟getApplication()
电话。
当我们查看你的类MyClass
以及以后如何使用它时,它将具有以下结构:
+---------------+ +--------------+ +----------------+
|Production Code| +-------> |MyClass.init()| +-------> |getApplication()|
+---------------+ +--------------+ +----------------+
现在,为了测试MyClass.init()
方法,一个有用的测试设置可能如下所示:
+---------+ +--------------+ +-----------------------+
|Test Code| +-------------> |MyClass.init()| +-------> |mocked getApplication()|
+---------+ +--------------+ +-----------------------+
测试代码将调用MyClass.init()
方法,因为这是您要测试的方法。你不想测试MyClass.init()
调用的其他类/方法,因此它可能是一个很好的选择来模拟它们。 (请注意,这不是强制性的,有时您也可以使用刚刚使用的其他组件来实现所有单元测试目标,而不会嘲笑。)
但是,您所做的是以下内容:
+---------+ +---------------------+
|Test Code| +-------------> |mocked MyClass.init()|
+---------+ +---------------------+
现在你可以清楚地看到,为什么你也没有在原来的MyClass.init()
中看到任何有遮盖的线条,因为那只是没有被调用。