我们的团队成员正在加强单元测试,我们正在努力学习一些术语。我想确定特定模式的名称。我希望有一个已经被其他开发者所接受,但如果没有,我想提出一个描述性的,并且会更容易讨论测试策略。
此模式用于测试抽象方法,但在对象创建新对象时也很方便(对于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是一个“模拟”对象,但由于它不是由模拟框架管理,似乎应该有另一个术语来描述这种模式。有什么建议或想法吗?
答案 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);