所以我正在测试的课程代码看起来像这样
public void doSomething(int param)
{
Report report = new Report()
...do some calculations
report.someMethod(someData)
}
我的目的是将报告的构造提取到受保护的方法中并覆盖它以使用我可以测试的模拟对象,以确保使用正确的数据调用someMethod。
到目前为止一切顺利。但报告不在我的控制之下,并且更糟糕的是它使用JNI在运行时加载库。
如果我这样做 报告报告= EasyMock.createMock(Report.class)
然后EasyMock尝试使用反射来查找类成员,但是这会导致尝试加载JNI库,该库失败(JNI库仅在UNIX上可用)。
我正在考虑两件事:a)引入一个带有两个实现的ReportWrapper接口,其中一个实现将调用委托给一个真正的Report(基本上就是一个Proxy),另一个实际上将使用一个mock对象。或者b)不是调用someMethod,而是调用一个受保护的方法,该方法将调用someMethod,我可以在测试子类中覆盖它。
无论哪种方式,它似乎都很讨厌。有更好的方法吗?
答案 0 :(得分:0)
如果没有Report
类的接口,那么建议的包装器是正确的方法
书"Refactoring: Improving the Design of Existing Code"有一章关于从设计糟糕的类中提取接口。
如果你正在使用一些DI框架(例如SpringFramework),你可以用一些ObjectFactory
轻松替换这个对象,以创建正确的实现(模拟与真实)。
答案 1 :(得分:0)
使用EasyMock,您将不得不求助于某种形式的重构。避免它的唯一方法是使用可以模拟内部创建的对象的模拟工具。使用JMockit(我开发的工具),测试可以这样编写:
public void testDoSomething(final Report mockedReport)
{
// create "someData"
objectUnderTest.doSomething(123);
new Verifications() {{ mockedReport.someMethod(someData); }};
}