2011-08-31 61 views
1

我们的团队的成员正在加紧进行单元测试,并且我们正在努力应用一些术语。我想确定一个特定模式的名称。我希望有一个已经被其他开发人员所接受,但如果不是,我想提出一个描述性的,并且会让测试策略更容易讨论。你称之为用于测试的内部类是什么?

此模式用于测试抽象方法的相当多,但在对象创建新对象时(对于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

我所能所有'TestableMyClass'本着存根[1] [1] [这]:HTTP:/ /stackoverflow.com/questions/463707/what-are-the-differences-between-mocks-and-stubs-on-rhino-mocks – hvgotcodes

回答

0

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

0

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

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

0

模拟包含测试断言。

存根提供简单的硬编码值使测试工作。

提供复杂的行为/答案。

我通常会在内部类的前面加上两个下划线作为测试的前缀,所以它不会显示在自动完成中,例如, '__TestableMyClass'。此外,如果你正在使用你的Mockito应磕碰像这样

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