Uni*_*iqe 6 java junit static-methods unit-testing
我正在Java中实现一个模型,它需要迭代一个集合并经历一些识别阶段,它涉及到循环,而循环等.这是我想在细粒度级别测试的那种东西,所以我有信心它已得到妥善实施.
我用它作为开始单元测试的机会,因为我认为它对我的代码有益.从那以后,我一直在阅读一本书籍,以便快速掌握JUnit和单元测试.
基本上我的问题归结为我收到的两条相互矛盾的建议:
1)静力学是邪恶的.不要碰静电.不要测试私有,你可能想要一个类.
2)使用工厂进行创建以允许使用参数进行依赖注入 - 可能允许使用模拟和存根进行隔离.
在我的例子中,我希望执行以下操作:
double height = 223.42; // this was set iterating over a collection of doubles
//blah
HeightBounds b = HeightBounds.getHeightBounds(height);
//more blah
Run Code Online (Sandbox Code Playgroud)
我这样做是为了避免构建一个非常长而复杂的代码块,我只能对其进行全面测试.这样我就可以测试公共可访问对象,以确保系统组件都能正确执行.
常识告诉我,静态工厂没有任何问题,并且它们很容易测试,但是在我学习测试驱动设计时,我是否遗漏了一些令人眼花缭乱的东西?
谢谢
静态工厂类引入了你的类和HeightBounds类之间的耦合。这可能会使你的类难以测试,例如HeightBounds在数据库中查找信息,或者从网络服务中读取等。
如果您将一个IHeightBounds实现注入到您的类中,那么您可以模拟它,以便您可以测试当您的类的依赖项执行某些操作时会发生什么。
例如,如果HeightBounds抛出异常怎么办?或者返回null?或者您想测试特定内容何时HeightBound返回?使用接口很容易模拟这种行为,而使用静态工厂则更困难,因为您已经制造了数据以在类中创建所需的结果。
您仍然只能有一个实现HeightBounds,并且能够单独测试它,但是您甚至可以在没有真正的实现的情况下测试上面的方法。
我可能会有一个IHeightBoundFactory接口并将实现注入到类中。
至于测试私有,通常你不想这样做。您想要测试两件事之一,要么结果是您预期的,要么交互是您预期的。
如果您调用了一个方法 Add,又调用了一个方法GetAll,那么您可能需要测试一下,当您调用Add然后调用时GetAll,您会返回您添加的方法。你并不关心它是如何实现的,只关心它是否有效。这是测试结果。通常在这种情况下,您需要创建返回数据的模拟对象。这似乎就是你的情况。
如果您在调用时Add希望记录所添加的内容,那么您想要测试与日志记录依赖项的交互,因此您注入一个模拟依赖项并验证在调用Add. 通常,在这种情况下,您希望创建设置了期望的模拟对象,并验证这些期望是否得到满足。在您上面描述的情况下,这似乎没有必要。
| 归档时间: |
|
| 查看次数: |
3430 次 |
| 最近记录: |