【问题标题】:Unit testing overloaded methods单元测试重载方法
【发布时间】:2015-10-26 00:13:51
【问题描述】:

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

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

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

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

问候

【问题讨论】:

  • 你能给我们看看代码吗?此外,TDD 是一种实践,可能需要一些时间来适应。根据我们正在研究的内容,很难说它是否能帮助您“避免”这个问题。
  • 代码好吗?并且,删除 tdd 问题,否则您的问题将被关闭为“太宽泛”

标签: java unit-testing junit mockito


【解决方案1】:

首先: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
   }
}

...你可以这样做...

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 来验证)?
  • 您的实现类是否正确地完成了工作(然后您只需要测试一次)?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多