单元测试重载方法

use*_*072 3 java junit unit-testing mockito

我有一个包含两个公共方法的类,它们的工作非常相似,但参数类型不同。这些方法只提取所需的数据,并且都调用实际完成工作的相同私有方法。

我的问题是,测试这门课的最佳方法是什么?我只想测试公共方法,所以为了确保两种方法都返回正确的数据,我最终为文学相同的断言/概念创建了两种测试方法。

此外,我不知道将断言移动到私有方法以不复制断言的代码是否是最好的主意。有时测试是文档的重要组成部分,我希望通过阅读测试让其他开发人员完全理解我的代码。

我使用 junit 4,mockito,我不使用 TDD。无论如何,TDD 会帮助我避免这个问题吗?

问候

Flo*_*etz 5

首先:TDD 不是可以解决所有问题的神奇子弹。它可以帮助从一开始就使代码变得更好,但即使使用 TDD,您仍然可能会产生糟糕的代码。

因此,您必须问自己的第一个问题是,您是否真的需要两种方法。这是一个没有任何代码就没有人可以回答的问题。

如果您确实需要两种方法,那么这两种方法都是公共 api 的一部分,应该进行测试。这样您就可以确保您的参数映射中没有错误(如果您的私有方法运行良好,但您未能提供正确的参数,那会很尴尬)。

当然,您也可以直接测试私有方法,但老实说,我认为这不是一个好方法。另一种可能性是你可以通过组合来解决你的问题,换句话说,不要把它变成一个私有方法,而是添加一个可以设置为执行私有方法工作的接口,例如,而不是...

public class MyPublicClass {
   public void method1(Data1 x) {
       ....call private method
   }

   public void method2(Data2 x) {
       ....call private method
   }

   private void methodX(String, int, int, double, String)
       ...do the work
   }
}
Run Code Online (Sandbox Code Playgroud)

……你可以……

public class MyPublicClass {

   private MyNewInterface executor;

   // probably good idea to make executor final and set it in the constructor

   public void method1(Data1 x) {
           executor.method( ... );
   }

   public void method2(Data2 x) {
           executor.method( ... );
   }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以独立测试多项内容:

  • 公共方法是否提供正确的参数(通过使用MyNewInterface您可以验证的接口)?
  • 你的实现类是否正确地完成了工作(然后你只需要测试一次)?

如果这种重构对您的情况是个好主意,则只有您才能回答这个问题。