【发布时间】:2012-09-07 00:19:36
【问题描述】:
我有一个转发方法foo的课程:
void foo( Concrete c, String s ) { c.bar( s ); }
我想测试foo 实际上是否转发。对我来说不幸的是,Concrete 是第三方库中的一个类,是一个具体的类型,而不是一个接口。因此我必须在 JMock 中使用ClassImposteriser 来模拟Concrete,所以在我的测试用例中,我这样做:
@Test
public final void testFoo() {
Mockery context = new JUnit4Mockery() {{
setImposteriser(ClassImposteriser.INSTANCE);
}};
final Concrete c = context.mock(Concrete.class);
final String s = "xxx" ;
// expectations
context.checking(new Expectations() {{
oneOf (c).bar(s); // exception gets thrown from here
}});
new ClassUnderTest.foo( c, s );
context.assertIsSatisfied();
}
不幸的是,Concrete.bar 又调用了一个抛出的方法。该方法是最终的,所以我不能覆盖它。此外,即使我注释掉 new ClassUnderTest.foo( c, s ); 行,当 JMock 设置异常时会抛出异常,而不是在调用 foo 时。
那么我该如何测试ClassUnderTest.foo 转发到Concrete.bar 的方法呢?
编辑:
是的,小节是最终的。
我的不是通用解决方案是使用第三方库中的“Tester”类来正确设置Concrete。
【问题讨论】:
标签: java unit-testing jmock