你怎么称呼用于测试的内部类?

时间:2011-08-31 16:07:46

标签: unit-testing naming-conventions

我们的团队成员正在加强单元测试,我们正在努力学习一些术语。我想确定特定模式的名称。我希望有一个已经被其他开发者所接受,但如果没有,我想提出一个描述性的,并且会更容易讨论测试策略。

此模式用于测试抽象方法,但在对象创建新对象时也很方便(对于DI不起作用或不需要的情况)。基本模式是使用扩展被测试类的内部类来公开受保护的方法。

考虑以下代码(伪代码,基于Java,但应转换为大多数语言):

要测试的课程:

public class MyClass {
  public void send() {
    //do something
  }
  protected MailMessage createNewMailMessage() {
    return new MailMessage();
  }
}

测试:

public class MyClassTest {
  private MyClass myClass = new TestableMyClass();
  private MailMessage mockMessage = mock(MailMessage.class);

  public void setup() {
    ((TestableMyClass)myClass).setMailMessage(mockMessage);
  }

  // Do some tests //

  private class TestableMyClass extends MyClass {
    private MailMessage mailMessage;

    public void setMailMessage(MailMessage mailMessage) {
      this.mailMessage = mailMessage;
    }

    protected MailMessage createNewMailMessage() {
      return mailMessage;
    }
  }
}

那么,你怎么称呼这种模式? TestableMyClass是一个“模拟”对象,但由于它不是由模拟框架管理,似乎应该有另一个术语来描述这种模式。有什么建议或想法吗?

3 个答案:

答案 0 :(得分:0)

我称之为存根。正如你所说,它不是一个真正的“模拟”,因为它的行为不受模拟框架的控制,而是一个“真正的”对象。

答案 1 :(得分:0)

你不需要使用模拟框架来调用Mock / Stub对象 - 你的MyClassTest(我假设它应该扩展MyClass)只是一个Stub。

我不认为Mocks / Stub被定义为测试类的内部类的情况有一个特定的名称 - 在这里的特定示例中,没有理由将它作为内部类 - 它可能只是是一个受包受保护的类(与MyClassTest在同一文件中或在其单独的文件中。)

答案 2 :(得分:0)

模拟包含测试断言。

Stub 提供简单的硬编码值,以使测试工作。

提供复杂的行为/答案。

我通常会添加两个下划线作为内部类的前缀进行测试,因此它不会显示在自动完成中,例如'__TestableMyClass'。此外,如果你使用Mockito,你应该像这样短暂

MyClass myClass = mock(MyClass.class);
when(myClass.createNewMailMessage()).thenReturn(mockMessage);