如何对一个方法进行单元测试,该方法只是在junit中初始化一个变量

问题描述 投票:0回答:2

我有一个像下面这样的方法

  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生成覆盖率报告。

unit-testing junit mockito code-coverage junit4
2个回答
0
投票

当你创建一个从另一个方法调用的测试时,你可以模拟init方法。

但是如果你想测试init方法本身(并获得它的覆盖范围),你不需要模拟它。只需从您的测试中调用它。反过来,如果需要,你可以模拟getApplication()电话。


0
投票

当我们查看你的类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()中看到任何有遮盖的线条,因为那只是没有被调用。

© www.soinside.com 2019 - 2024. All rights reserved.