我有一个带有两个公共方法的类,它们的工作非常相似,但参数类型不同。这些方法只提取所需的数据,并且都调用实际完成工作的相同私有方法。
我的问题是,测试这门课的最佳方法是什么?我想只测试公共方法,所以为了确保两个方法都返回正确的数据,我最终为文学创建了两个测试方法相同的断言/概念。
此外,我不知道将断言移至私有方法以不重复断言的代码是最好的主意。有时测试是文档的重要组成部分,我想通过阅读测试让其他开发人员完全理解我的代码。
我使用junit 4,mockito,我不使用TDD。 TDD会帮助我避免这个问题吗?
此致
答案 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;
});
});
)?只有你能回答这个问题,如果这样的重构对你的案子来说是个好主意。