为if else块写jUnit测试用例

时间:2016-08-14 12:31:20

标签: java android junit tdd junit4

我有一个带有简单if / else块的方法。在if和else块中都调用了一个私有方法。

下面是我想编写单元测试用例的方法。

public void enableBLEScan() {
        if (<some boolean expression which can be mocked>) {
            initializeScan();
        } else {
            stopScan();
        }
    }

我可以很容易地删除布尔表达式的行为。

但我想检查内部的方法调用if else block是否正确发生。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

重点是:测试内部私有方法是否被调用...在编写单元测试时是一种反模式!

测试内部实施细节。对你的测试来说,一些“面向外部”的方法如何做它的作用并不重要。换句话说,您有以下选择:

  1. 如果要在测试类的“字段”上调用方法,请使用依赖注入来插入相应对象的模拟版本。然后,您可以验证是否调用了预期的方法。
  2. 检查可观察行为。含义:打电话给你的“测试方法”;并检查返回的值这样的方法;或者在打完电话后使用其他吸气剂来检查班级的内部状态。
  3. 换句话说:您的每个“公共”方法都应该具有明确的定义含义。所以,如果你打电话给他们,他们会有一个明确的效果;并且应该观察/断言这种效果。

    很可能你当前的设计真的支持这些想法。然后,认真地:考虑退一步并改变你的设计。因为:你创造了一些不合理的可测试的东西。那么很可能......你的设计也存在其他问题。

答案 1 :(得分:0)

检查是否调用了私有方法并不是您应该尝试在单元测试中进行测试 这不是验收测试。通常,您希望测试类的行为和/或行为的结果。
在你的情况下,我看到两个清晰的可能性:

  • 将您的设计更改为有两个类并模拟被调用的类。

对于这种做法,我想你必须知道。

  • 使行为创建结果。

例如,您可以根据ScanStateinitializeScan()中的逻辑在类中添加枚举字段stopScan()

ScanState示例:

public enum ScanState{
  (INITIALIZED, STOPPED)
}