2009-07-14 55 views
1

我们终于从迁移的JUnit 3我们的单元测试代码库中的JUnit 4支持基类的我们也大量使用JMock的2缺乏在Junit4/Jmock2

的在JUnit 3,JMock的提供了一个有用的测试基类(MockObjectTestCase),它本身也是Junit TestCase的子类,它处理有关模拟框架的各种内务职责。它让测试课变得非常容易。

现在使用JUnit4,JMock不提供这种支持。你的测试类必须手动创建一个Mockery对象,它必须记住使用正确的测试运行器注释,并且必须将所有与模拟相关的操作委托给嘲笑。简而言之,它对测试类的责任远远超过JUnit 3测试所需的责任。

现在我明白JUnit4的一部分魅力在于不需要继承某些东西,但是这种JMock情况看起来像是倒退了一步,并且使得从3移植到4应该比应该需要更多的工作。

我错过了什么吗?实际上是否有一种很好的方式来编写我的JUnit4/Jmock2测试类,而无需手动将所有管道添加到每个类?当然,我可以编写自己的支持基类,但似乎JMock2 API中有一个明显的漏洞,我不得不怀疑我是否错过了这一点。


编辑:这里有一个可选的支持类会是什么样子的源代码:

@RunWith(JMock.class) 
public class JMockSupport { 

    protected final Mockery mockery = new Mockery(); 

    protected void checking(ExpectationBuilder expectations) { 
     mockery.checking(expectations); 
    } 

    protected <T> T mock(Class<T> typeToMock) { 
     return mockery.mock(typeToMock); 
    } 

    protected <T> T mock(Class<T> typeToMock, String name) { 
     return mockery.mock(typeToMock, name); 
    } 

    protected Sequence sequence(String name) { 
     return mockery.sequence(name); 
    } 

    protected void setDefaultResultForType(Class<?> type, Object result) { 
     mockery.setDefaultResultForType(type, result); 
    } 

    protected void setImposteriser(Imposteriser imposteriser) { 
     mockery.setImposteriser(imposteriser); 
    } 

    protected void setNamingScheme(MockObjectNamingScheme namingScheme) { 
     mockery.setNamingScheme(namingScheme); 
    } 

    protected States states(String name) { 
     return mockery.states(name); 
    } 
} 

这包含了所有的JUnit3 MockObjectTestCase类中定义的方法,这只是呼应的嘲弄。 @RunWith注解也在那里,以避免忘记将其添加到测试类中的可能性。

回答

1

有基类也有问题。在以前的版本中,我尝试将来自不同测试框架的基类进行组合。这就是为什么我们要继承构图。看看我们能用新的@Rule结构做什么会很有趣。

+0

我同意构图的灵活性非常高,但是继承带来了方便。能够挑选是很好的。 – skaffman 2009-09-05 21:06:18

1

不。没有这种支持。

JMock 1中的测试基类导致了很多问题,因为您只能扩展一个类,因此人们无法将JMock与定义基类的其他测试框架一起使用。这就是为什么我们在JMock2中使用委托而不是继承。这就是说,只要你用@RunWith(JMock.class)注解你的类,你就可以使用JMock2的JUnit3支持库中的MockObjectTestCase类。但我没有尝试过。

有一个“自动模拟”JUnit4运行器的请求,它将通过自动反射为您创建上下文和模拟对象。有些人喜欢这样,其他人真的不喜欢它。如果你想要这个功能,vote for the issue in the JMock JIRA

+0

呵呵hullo Nat,没想到会在这里找到你:)我修改了我的问题以包含建议的基类的来源。请注意,它完全是可选的,但确实让生活更轻松一些。 – skaffman 2009-07-14 10:56:27

2

我也做过这个迁移,这是一个痛苦。我可以理解为什么他们已经对基类机制进行了分类 - 我试图用支持Spring JUnit的基类来处理JMock基类,而这显然不起作用。

一旦我开始这种迁移,我发现“优化”的一个领域是创建适当的Expectation基类,在您的模拟对象上封装常用操作,而不是为每个测试创建一个新的Expect对象(和实例)。这会为你节省一点痛苦。

+0

认为您评论过错误信息? – 2009-07-14 10:51:53