单元测试重载方法

时间:2015-10-26 00:13:52

标签: java unit-testing junit mockito

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

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

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

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

此致

1 个答案:

答案 0 :(得分:2)

首先:TDD不是一个可以杀死你所有问题的神奇子弹。它可以帮助从一开始就使代码更好,但即使使用TDD,你仍然可以产生错误的代码。

所以,你要问自己的第一个问题是,如果你真的需要两种方法。这是一个没有任何代码没人能回答的问题。

如果您确实需要两种方法,那么它们都是您的公共API的一部分,应该进行测试。这样你可以确定你的参数映射没有错误(如果你的私有方法工作得很好但你没有给出正确的参数,那就会很尴尬)。

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

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( ... );
   }
}

......你可以......

MyNewInterface

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

  • 公共方法是否提供了正确的参数(使用您可以验证的界面的app.controller('listCtrl', function ($scope, services) { $scope.sort = function(keyname){ $scope.sortKey = keyname; //set the sortKey to the param passed $scope.reverse = !$scope.reverse; //if true make it false and vice versa } $scope.currentPage = 1; $scope.pageSize = 10; services.getPosts().then(function(data){ $scope.posts = data.data; }); }); )?
  • 您的实现类是否正常工作(然后您只需要测试一次)?

只有你能回答这个问题,如果这样的重构对你的案子来说是个好主意。