如何用 Easymock 替换我的实例

How do I replace my instances with Easymock

我正在尝试使用 EasyMock 对 class 进行单元测试。为了简化事情,我在下面做了一个例子。我想要的是在测试期间将 StringBuilder 实例替换为 EasyMock 实例。 (因为它不是我要测试的 StringBuilder 的功能。)不幸的是,这在下面的示例中不起作用。在其他测试中,我有一个解决方法,通过使用 EasyMock 实例设置实例变量,但是对于这个例子,我无法做到这一点,因为它是我关心的本地实例化对象。

谁能帮帮我?

要测试的class:

package example.easymock

public class Example {

    public String exampleMethod() {
        StringBuilder string = new StringBuilder();
        string.append("hello");
        return string.toString();
    }
}

测试class:

package example.easymock

import needed classes

public class ExampleTest {

    @Test
    public void exampleMethodTest() {
        StringBuilder stringMock = EasyMock.createMock();
        Example example = new Example();
        stringMock.append("hello");
        EasyMock.expect(stringMock.toString()).andReturn("hi");

        EasyMock.replay(stringMock);

        example.exampleMethod();
     }
}

仅使用 EasyMock 这是不可能的。 PowerMock 确实包含这样做的权力:

expectNew(StringBuilder.class).andReturn(stringMock);

您当然需要正确设置 PowerMock 配置才能正常工作 - 查看更多 here

这并没有改变事实,正是这种不可能(部分)导致广泛采用 Inversion of Control 作为设计原则。此外,通常,您无法测试的任何方法都是可以重构为更好(和可测试)的方法。 PowerMock 只应在代码本身无法更改为更好时用于测试。

这当然是假设 StringBuilder 只是一个例子,而不是您真正想要做的。如果是 - 不要打扰,您可以假设作为语言库一部分的任何方法都像宣传的那样工作。