繁体   English   中英

使用EasyMock模拟使用jni的对象

[英]Mocking an object that uses jni using EasyMock

所以我正在测试的班级的代码看起来像这样

public void doSomething(int param)
{
    Report report = new Report()
    ...do some calculations
    report.someMethod(someData)
}

我的意图是将报告的构造提取到受保护的方法中,并覆盖它以使用模拟对象,然后我可以对其进行测试以确保已使用正确的数据调用了someMethod。

到现在为止还挺好。 但是Report不是我所能控制的,更糟糕​​的是它使用JNI在运行时加载库。

如果我报告Report = EasyMock.createMock(Report.class)

然后EasyMock尝试使用反射来查找类成员,但这会导致尝试加载JNI库,但失败(JNI库仅在UNIX上可用)。

我考虑了两件事:a)引入一个具有两种实现的ReportWrapper接口,其中一种将委派对实际Report的调用(因此基本上是Proxy),第二种将基本上使用模拟对象。 或b)而不是调用someMethod,而是调用一个受保护的方法,该方法将依次调用我可以在测试子类中覆盖的someMethod。

不管怎样,这似乎令人讨厌。 还有更好的方法吗?

如果没有Report类的接口,则建议的包装器是正确的方法。
《重构:改进现有代码的设计》一书中有关于从不良设计的类中提取接口的章节。

如果您使用某些DI框架(例如SpringFramework),则可以轻松地用一些ObjectFactory替换该对象以创建正确的实现(模拟与实际实现)。

使用EasyMock,您将不得不诉诸某种形式的重构。 避免这种情况的唯一方法是使用可以模拟内部创建的对象的模拟工具。 使用JMockit(我开发的工具),测试可以这样编写:

public void testDoSomething(final Report mockedReport)
{
    // create "someData"

    objectUnderTest.doSomething(123);

    new Verifications() {{ mockedReport.someMethod(someData); }};
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM