为if else块编写jUnit测试用例



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

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

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

我可以很容易地存根布尔表达式的行为

但是我想检查if else块中的方法调用是否正确发生。我怎么能这么做呢?

关键是:测试内部私有方法是否被调用…在编写单元测试时是一个反模式!

你做而不是测试内部实现细节。对于您的测试来说,一些"面向外部"的方法如何实现它的功能并不重要。换句话说,您有以下选择:

  1. 如果你在被测类的"字段"上调用方法,使用依赖注入来插入相应对象的模拟版本。然后您可以验证是否调用了预期的方法。
  2. 检查可观察行为。含义:调用你的"测试方法";并检查这些方法返回的值;或者在调用之后使用其他getter来检查类的内部状态。

换句话说:你的每个"公共"方法都应该有一个明确的、定义好的含义。所以,如果你打电话给他们,他们会有一个明确的效果;这种影响应该被观察/断言。

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

检查私有方法是否被调用并不是你应该在单元测试中测试的。
这不是验收测试。通常,您希望测试类的行为和行为的结果。
对于您的情况,我看到了两种明确的可能性:

  • 把你的设计改成两个类,并模拟调用的类。

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

  • 使行为产生结果。

例如,你可以在你的类中添加一个枚举字段ScanState,根据你在initializeScan()stopScan()中的逻辑设置。

ScanState示例:

public enum ScanState{
  (INITIALIZED, STOPPED)
}

最新更新