JUnit - 确保在每个路径上调用一个函数

时间:2017-03-22 10:00:08

标签: java junit mockito

我知道如何使用以下方法确保调用了一个函数:

mockito.verify

现在,我想确保在功能的每个路径上(每个'如果',' if else'' else') - 功能被调用。 我基本上可以为每个案例编写单元测试,但我想确保如果还要添加任何其他案例 - 也会调用该方法。

3 个答案:

答案 0 :(得分:0)

单独进行单元测试不会那样做。你必须考虑使用 coverage 来实现目标。

单元测试只能告诉您所采取的路径是否会导致"有效"结果;但是并不知道"所有路径"那存在;如果他们都被击中了。

所以你想以here为例,了解哪种覆盖工具适合你。

当你使用eclipse或intellij时,这些东西开箱即用;你可以在eclipse中安装像cobertura或eclemma这样的插件;然后进行"运行单元测试覆盖"。

但当然:这只会产生一个数字。然后,您必须仔细查看您的代码,以了解您是否对该数字感到满意(这些IDE非常简单;它们可以向您显示源代码,以及采用的路径)。

含义:覆盖是一个完整的概念,你必须明白这意味着什么;您可以通过哪种方式为日常工作制定帮助这一概念。例如,你最不想要的就是你的老板给你一个特定的目标目标。

只是为了确定:没有工具可以告诉您:您添加了新代码,现在此特定方法调用不再通过所有部分。保险范围给您的是您在更改前获得75.32%的保险;然后,它下降到74.01%...其余的由你决定。

答案 1 :(得分:0)

  

现在,我想确保在函数的每个路径上(每个'if','if else'和'else') - 调用该函数。

你不希望这样。

误解是你不测试“代码”。您测试公共可观察行为。在你的情况下,行为是你的被测单元(UuT)(在做其他事情之后)调用依赖的方法(我希望)。

您不想测试“代码”,因为它可能会变得更清洁和/或支持更多行为。但是,您不希望更改现有测试,因为它们可以保证在重构期间保留所需的行为。

另一方面,每个测试方法都应该验证关于UuTs行为的正好一个期望。这意味着您应该已经通过if / else级联为每个执行路径设置了一个测试方法。因此,您所要做的就是为每个测试方法添加verify()指令。

最后,如果你强制单层抽象原则,你可能会更轻松地测试你的代码,这基本上说一个方法要么调用一些依赖的方法(也就是“调度”),调用内部方法或低水平的操作。这个原则可能会导致一种设计,你的UuT目前所做的“低级”操作会转移到一个新的依赖项,这样你的UuT只需要按某种顺序对一些依赖项进行两次调用......

答案 2 :(得分:0)

在我需要严格测试绑定交换机案例之前,我遇到过这个问题,我非常渴望这样做。

我认为测试覆盖率分析对你来说还不够。对我来说,if-else条件部分是如此重要,以至于无意中改变某些东西可能已经证明是非常灾难性的,所以我不能留下容易出错的代码,我需要一个测试用例来满足自己。

我对自己的满意程度如下:

1:将if..else等条件更改为swich case变量 - TaskSwitcherEnum,比如taskSwitcher,并在TaskSwitcherEnum的各种可能值下执行各种操作。

switch (taskSwitcher){
    case TaskSwitcherEnum.Task_Type_1: 
        //do Something before break
        break;
    case TaskSwitcherEnum.Task_Type_2: 
        //do Something again
        break;
    ...
}

2:针对taskSwitcherEnum的所有可能值严格测试所需方法。 Mockito.verify(),对于每个给定的TaskSwitcherEnum值,是否调用一次所需的任务方法。

3:最后做了这样的junit:

assertEquals("Task performance strategy is designed to handle only five cases.", 5, taskSwitcherEnum.values().length);

这样做确保[至少测试覆盖]以下事项:

1:我的代码只有所需的分支,并且测试用例会捕获任何其他代码分支的添加/删除。

2:通过调用我想要的方法,每个分支完成它所需的工作,通过针对被调用的方法测试每个特定的Enum值。

整个答案的要点是,有时一点点的设计改变会有很大的帮助。