如果您能够重构代码,则可以将对final / static方法的调用包装在简单的实例方法中,例如:
protected Foo doBar(String name) { return Utility.doBar(name);}这使您可以在单元测试中覆盖包装方法,以返回Foo的模拟实例。
另外,您可以使用Powermock,它扩展了Easymock(和Mockito)以允许模拟final和static方法:
PowerMock是一个框架,它以更强大的功能扩展了其他模拟库,例如EasyMock。PowerMock使用自定义的类加载器和字节码操作来对静态方法,构造函数,最终类和方法,私有方法,静态初始化程序的删除等进行模拟。
这是一个模拟静态final方法的示例测试,该示例还显示了如何模拟其他一些类型:
@Testpublic 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()); }}


