我有一个转发方法的类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.