单元测试私有内部类方法

Roo*_*kie 5 java unit-testing jmock mockito

我有一个A类,它有一个由B类代表的内部Cache.这个内部类是私有的,因为缓存不需要对外部消费者可见,只是为了帮助外部类A.我使用的是Jmock和Java

public class A {
    ...
    private class B {
    ... 
       public void testMethod() {
          //The method I want to unit test
          ...
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

如上所示.我不确定如何对来自私有内部类B的testMethod()进行单元测试(因为B类对于外部世界是不可见的).

请指教!

谢谢!

Dav*_*vid 7

因为缓存不需要对外部消费者可见

单元测试是外部消费者.它是一个类,它调用被测对象的功能,就像任何其他类一样.

警告:关于这个问题有很多意见和争论.我在这里展示的不是"一个真正的答案",而是基于我自己在代码中维护单元测试的经验.

不要直接对私人成员进行单元测试.它不仅通常需要一点点诡计才能实现,它会在类之间创建耦合.(测试类和正在测试的类.)暴露内部和耦合它们违反了面向对象的原则.

而不是根据您在类中调用的方法来考虑测试,而是根据您在单元上调用的功能来考虑测试.无论该单元暴露什么功能,都应该测试什么.

这导致了一些结论:

  • 如果没有内部调用相关私人成员的公共功能,那么为什么那些私人成员呢?只需删除它们.
  • 如果私有功能非常复杂并且很难仅使用公共功能来调用/验证,则可能需要进行一些重构以简化类.

由于使用该对象的代码只能调用公共功能,因此测试该对象的代码应仅验证公共功能.


wes*_*ton 5

如果您严格遵循 TDD 方法,则私有方法和私有内部类只是红/绿/重构循环中重构步骤的结果。

所以方法应该是:

  1. 编写测试来测试类的公共接口(包括此缓存行为),并编写代码以随时通过这些测试。这将导致很长的公共方法和一些显然只与缓存相关的字段。
  2. 然后从长的公共方法中重构出一些与缓存相关的私有方法。
  3. 下一步应该是将私有缓存字段和方法移至私有内部类。每次重构后,测试应该无需修改即可通过。

您将完成仍然经过全面测试的私有方法,但只能通过公共接口进行测试。