【问题标题】:Java Unit tests on methods that use third parties libs that don't use Interfaces对使用不使用接口的第三方库的方法进行 Java 单元测试
【发布时间】:2009-07-26 23:59:41
【问题描述】:

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

private ThirdParyClass thirdPartyClass;

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

我想测试是否使用“abc”参数调用了执行。

我正在考虑使用包装 ThirdPartyClass 的实现来创建 MyInterface,然后将类属性更改为引用 MyInterface。很无聊的东西,但我看不到任何其他方法可以成功测试我的课程。
如果 ThirdParyClass 是一个接口,我可以模拟它,但在这种情况下,你如何处理?

【问题讨论】:

    标签: java unit-testing testing mocking


    【解决方案1】:

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

    问候,

    【讨论】:

    • EasyMock 2.4 类扩展,这就是我要找的!非常感谢:)
    • 问候,我也同时使用 EasyMock 和 TestNG。它非常强大。
    【解决方案2】:

    您可以使用JMockit。它远远超出了 EasyMock 类扩展或 jMock 及其 ClassImposteriser 所能提供的范围。您实际上获得了 AspectJ 的所有强大功能,但使用了更易于使用、特定于模拟的 API。

    【讨论】:

      【解决方案3】:

      只要您使用的第三方类不是 final 并且您不需要模拟 final 方法,您就可以使用 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)

      【讨论】:

        【解决方案4】:

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

        通过使用 around 方面,您可以控制传入方法的内容并更好地对其进行监控。

        如果你需要让它扩展一个接口,你可以通过方面来修改这个类来赋予它更多的功能,比如打开/关闭日志或者获取性能信息。

        然后,当你完成后,在将其投入生产之前删除这些方面,只是在构建中不包括方面类文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多