我正在尝试为aproject实现单元测试,它使用了遗留的"实用程序"项目,这个项目充满了静态方法,许多类都是最终的,或者它们的方法是最终的.我根本无法更新遗留项目.
JMock和EasyMock都扼杀了最终方法,我没有看到一种测试静态调用的好方法.有哪些技术可以测试这些?
Ric*_*ler 28
如果您能够重构代码,可以使用简单的实例方法将调用包装到final/static方法中,例如:
protected Foo doBar(String name) {
return Utility.doBar(name);
}
Run Code Online (Sandbox Code Playgroud)
这允许您在单元测试中覆盖您的包装器方法以返回Foo的模拟实例.
或者你可以使用Powermock,它扩展了Easymock(和Mockito),允许模拟最终和静态方法:
PowerMock是一个框架,可以扩展其他模拟库,例如EasyMock,具有更强大的功能.PowerMock使用自定义类加载器和字节码操作来实现静态方法,构造函数,最终类和方法,私有方法,静态初始化程序的删除等的模拟.
这是一个模拟静态final方法的示例测试,该示例显示了如何模拟其他类型:
@Test
public void testMockStaticFinal() throws Exception {
mockStatic(StaticService.class);
String expected = "Hello altered World";
expect(StaticService.sayFinal("hello")).andReturn("Hello altered World");
replay(StaticService.class);
String actual = StaticService.sayFinal("hello");
verify(StaticService.class);
assertEquals("Expected and actual did not match", expected, actual);
// Singleton still be mocked by now.
try {
StaticService.sayFinal("world");
fail("Should throw AssertionError!");
} catch (AssertionError e) {
assertEquals("\n Unexpected method call sayFinal(\"world\"):",
e.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
如何进行间接/依赖注入?
由于遗留实用程序项目是您的依赖项,因此请创建一个接口以将其与代码分开.现在,此接口的实际/生产实现委托给遗留实用程序方法.
public LegacyActions : ILegacyActions
{
public void SomeMethod() { // delegates to final/static legacy utility method }
}
Run Code Online (Sandbox Code Playgroud)
对于测试,您可以创建此接口的模拟,并避免与遗留实用程序对象进行交互.
| 归档时间: |
|
| 查看次数: |
33672 次 |
| 最近记录: |