java - 如何测试实用程序项目的 final方法和静态方法?

标签 java junit

我正在尝试为一个项目实现单元测试,它使用一个遗留的“实用程序”项目,其中散布着静态方法,并且许多类是最终的,或者它们的方法是最终的。我根本无法更新旧项目。

JMock 和 EasyMock 都对 final 方法感到窒息,而且我看不到测试静态调用的好方法。有什么技术可以测试这些?

最佳答案

如果您能够重构代码,则可以将您对最终/静态方法的调用包装在简单的实例方法中,例如:

protected Foo doBar(String name) {
    return Utility.doBar(name);
}

这允许您在单元测试中覆盖包装器方法以返回 Foo 的模拟实例。

您也可以使用 Powermock ,它扩展了 Easymock(和 Mockito)以允许模拟最终和静态方法:

PowerMock is a framework that extend other mock libraries such as EasyMock with more powerful capabilities. PowerMock uses a custom classloader and bytecode manipulation to enable mocking of static methods, constructors, final classes and methods, private methods, removal of static initializers and more.

这是 example测试模拟一个静态的 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());
    }
}

关于java - 如何测试实用程序项目的 final方法和静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1293337/

相关文章:

java - Lmax Disruptor,许多消费者 - 如何让消费者只接受特定类型的消息并独立进行?

c# - 在java中读取c#二进制文件

java - 如何从我的 Java 应用程序内部运行 JUnit 测试?

spring - 在纠缠的 spring 上下文中进行单元测试

java - SessionFactory.getCurrentSession() 与 EntityManager.createEntityManager()

scala - 如何在 Spark 2.0+ 中编写单元测试?

java - 如何根据 Java 中的模式匹配在 map 中找到键?

java - 使用 Canvas.drawText 从位图上的 TextView 获取错误的 Y 坐标

java - <> 在类名中是什么意思?

java - 动态创建作业的 Spring 批量测试