0

所以我的测试类的代码看起来很像这样

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

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

到目前为止,一切都很好。但是 Report 不在我的控制之下,更糟糕的是,它使用 JNI 在运行时加载库。

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

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

我正在考虑两件事:a)引入一个具有两个实现的 ReportWrapper 接口,其中一个将调用委托给一个真实的报告(所以基本上是一个代理),第二个基本上将使用一个模拟对象。或 b) 不调用 someMethod,而是调用受保护的方法,该方法又会调用我可以在测试子类中覆盖的 someMethod。

无论哪种方式,它似乎都令人讨厌。还有更好的方法吗?

4

2 回答 2

0

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

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

    objectUnderTest.doSomething(123);

    new Verifications() {{ mockedReport.someMethod(someData); }};
}
于 2011-02-15T12:10:22.220 回答
0

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

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

于 2010-12-24T10:49:09.757 回答