java – 使用JMock测试具体的第三方类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用JMock测试具体的第三方类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1801字,纯文字阅读大概需要3分钟。
内容图文
我有一个转发方法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依次调用抛出的方法.那个方法是最终的,所以我无法覆盖它.此外,即使我注释掉了新的ClassUnderTest.foo(c,s);这一行,当JMock设置异常时抛出异常,而不是在调用foo时抛出异常.
那么我如何测试ClassUnderTest.foo转发到Concrete.bar的方法呢?
编辑:
是的,酒吧是最终的.
我的解决方案不是一般的,是在第三方库中使用“Tester”类来正确设置Concrete.
解决方法:
如果Concrete.bar()是final或者Concrete.somethingElse()是final并且是从Concrete.bar()调用的,那么从问题文本中就不清楚了.
如果Concrete.bar()不是final,那么为Concrete创建一个手写的存根,如下所示:
public class ConcreteStub extends Concrete
{
public int numCallsToBar = 0;
@Override
public void bar(String s) { numCallsToBar++; }
}
并在您的测试代码中:
ConcreteStub c = new ConcreteStub();
foo(c,"abc");
assertEquals(1,c.numCallsToBar);
如果Concrete.bar()是最终的,它会更复杂,答案取决于Concrete的复杂性和您的项目对Concrete类的使用.如果你对Concrete的使用很简单,我会考虑在一个接口(Adapter Pattern)中包装Concrete,然后你可以更容易地模拟出来.
适配器模式解决方案的好处:在项目使用Concrete之后,通过命名接口可能会澄清行为.更容易测试.
适配器模式解决方案的缺点:引入更多类,对生产代码可能没什么好处.我不知道Concrete做了什么,在接口中包装Concrete可能不切实际.
内容总结
以上是互联网集市为您收集整理的java – 使用JMock测试具体的第三方类全部内容,希望文章能够帮你解决java – 使用JMock测试具体的第三方类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。