Java单元测试使用不使用接口的第三方库的方法

时间:2009-07-26 23:59:42

标签: java unit-testing testing mocking

我想知道如果您使用的库不使用接口
,如何测试您的方法 我的课就像

private ThirdParyClass thirdPartyClass;

void myMethod() { 
AnotherThirdPartyClass param = "abc";
...
thirdPartyClass.execute(param);
}

我想测试使用“abc”参数调用execute。

我正在考虑使用包装ThirdPartyClass的实现创建MyInterface,然后更改class属性以引用MyInterface。相当无聊的东西,但我没有看到任何其他方式能够成功测试我的课程 如果ThirdParyClass是一个接口,我可以嘲笑它,但在这种情况下,你如何处理?

4 个答案:

答案 0 :(得分:1)

我不知道你使用哪个模拟实现。但是EasyMock在EasyMock主页上有一个扩展,可以为类生成模拟对象。请参阅您的模拟实现,它是否不支持类的模拟对象。

的问候,

答案 1 :(得分:1)

您可以使用JMockit。它远远超出了EasyMock Class Extension或jMock及其ClassImposteriser的可能性。您实际上获得了AspectJ的所有功能,但使用更容易使用,特定于模拟的API。

答案 2 :(得分:0)

只要您使用的第三方课程不是最终的,并且您不需要模拟最终方法,您可以使用JMock and the ClassImposteriser来模拟它并继续照常进行。

private Mockery context = new Mockery() {{
    setImposteriser(ClassImposteriser.INSTANCE);
}};

AnotherThirdPartyClass mockThirdParty = context.mock(AnotherThirdPartyClass.class);

请注意,您需要添加一些额外的依赖项(jmock-legacy-2.5.1.jar,cglib-nodep-2.1_3.jar和objenesis-1.0.jar)

答案 3 :(得分:0)

为什么不直接使用AspectJ(AOP)进行单元测试。

通过使用around方面,您可以控制传递给方法的内容并更好地监控它。

如果您需要扩展接口,可以通过方面修改类以提供更多功能,例如打开/关闭日志记录或获取性能信息。

然后,当您完成后,只需在构建中不包含方面类文件,就可以在将其投入生产之前删除这些方面。