2016-08-14 34 views
0

我有一个简单的if/else块的方法。在if和else块中都调用私有方法。写jUnit测试案例,如果其他块

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

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

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

但是如果else块发生正确,我想检查里面的方法调用。我怎么能这样做?

+0

这两种私人方法在做什么?也许你可以检查这些方法设置的条件?或者你可以使用反射,请参阅http://stackoverflow.com/questions/34571/how-to-test-a-class-that-has-private-methods-fields-or-inner-classes?rq=1 – simonv

+1

所以有什么问题? –

+0

@OliverCharlesworth如果else块发生正确,我想检查里面的方法调用。 –

回答

0

检查调用私有方法不是你应该尝试在单元测试中测试。
这不是一个验收测试。通常,你想测试一个类的行为和/或行为的结果。
在你的情况,我看到两个干净的可能性:

  • 改变你的设计有两个类和嘲讽称为类。

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

  • 使行为创建结果。

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

ScanState例如:

public enum ScanState{ 
    (INITIALIZED, STOPPED) 
} 
+0

直接进入“enum”陷阱。如果你正在处理状态,那么创建一个**状态机**;意思是:有一个抽象基类并使用多态将每个状态建模为子类。如果你开始使用像这样的枚举,那么你一下子就会处理switch语句。严重:不要去那里。 – GhostCat

+0

我们不知道在该方法中做了哪些事情。所以,我只是以状态为例,依靠我们的单个信息:'initializeScan()'和'stopScan()'。指针是“使行为来创建结果”。 当你说'含义:有一个抽象基类,并使用多态性来将每个状态建模为子类'。我不同意。拥有状态字段并不意味着始终使用状态设计模式。如果不需要,你可以使用没有开销和没有状态机的状态。例如,一个流可能有一个简单字段的状态。 – davidxxx

1

的一点是:如果测试被称为内部私有方法...编写单元测试时是一个反模式!

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

  1. 如果您正在测试您的类的“字段”上调用方法,请使用依赖注入来插入相应对象的模拟版本。然后你可以验证预期的方法被调用。
  2. 检查可观察行为。含义:打电话给你的“正在测试的方法”;并检查返回的这些方法的值;或在打电话后使用其他获得者来检查班级的内部状态。

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

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