我有一个转发方法的类foo
:
void foo( Concrete c, String s ) { c.bar( s ); }
我想测试是否foo
确实转发。对我来说不幸的是,Concrete
它是第三方库中的一个类,是一个具体的类型,而不是一个接口。因此我必须ClassImposteriser
在 JMock 中使用来模拟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
.