【问题标题】:Why is it considered a bad practice to test a class by extending it?为什么通过扩展来测试一个类被认为是一种不好的做法?
【发布时间】:2019-04-16 09:59:45
【问题描述】:

据我了解,测试一个类有两种主要方法。

  1. 测试类以扩展被测类
  2. 测试类来创建被测类(组合)

据我所知,第一种方法被认为是一种不好的做法。

但这是为什么呢?

【问题讨论】:

  • FooTest 类的实例不必是Foo 的实例。绝不应该出现您想使用FooTest 的实例来代替Foo 的实例的情况。
  • @AndyTurner,一个优点可能是暴露受保护的方法,但我想这也被认为是一种不好的做法(测试受保护的方法)
  • UnitTest 验证被测代码的公共可观察期望行为public 表示其他生产代码调用此方法。这并不意味着被测代码通过 public 带注释的方法公开了这种行为,但通常情况下确实如此。
  • 关于私有/受保护等内容的测试:单元测试是关于发现错误。错误存在于实现中 - 不同的实现,不同的可能错误。将斐波那契视为迭代/递归函数、封闭形式表达式(Moivre/Binet)、查找表:接口始终相同,可能的错误差异很大。此外,在查看覆盖率时,您总是查看实现,而不是接口。你如何设计你的类,以便你真正可以测试实现细节是另一回事......

标签: java unit-testing oop testing


【解决方案1】:

对我来说,单元测试有两个主要目的:

  1. 验证测试对象是否符合我的预期
  2. 记录如何正确使用测试类

通过扩展测试类,测试接缝可能会改变类的行为。这是测试的坏习惯。 有时我什至会这样做来修复像这样的当前时间依赖性,如果 DI 不是选项:

   private InstanceToTest instance;
   private Calendar now = new GregorianCalendar(2019, 4, 4, 13, 23, 47);
   @Before
   public void initInstance() {
      instance = new InstanceToTest() {
         @Override
         Calendar getNow() {
            return now;
         }
      };
   }

现在我可以针对 2019 年 4 月 4 日 13:23:47 进行测试,以使测试稳定。

有时我想单独测试提取的内部方法。我更喜欢将这些方法包设为私有。这样我就可以从我的测试中调用它们(如果它在测试源文件夹中的同一个包中)而不会覆盖它们。

【讨论】:

    猜你喜欢
    • 2013-09-13
    • 2010-11-09
    • 1970-01-01
    • 2010-10-15
    • 2010-09-26
    • 2017-12-18
    • 2010-10-22
    • 2011-11-20
    相关资源
    最近更新 更多