java - 如何在运行 junit 测试用例时避免实际的方法调用

标签 java junit mocking

我有以下场景。

MyClass,其中我有一个API myAPI(),其内容如下:

class MyClass {
    public void myAPI() {
        ...
        MyOtherClass myOtherObj = new MyOtherClass();
        String value = myOtherObj.decodeAndGetName();
        ...
    }
}

这里我们有 MyOtherClass,它包含一个执行一些操作的 API decodeAndGetName()。它位于不同的包中,我无法修改其代码。

要求

我需要为上面的myAPI()编写一个junit测试。现在我想以某种方式模拟 MyOtherClass 的对象并模拟 decodeAndGetName() 的返回值。

我无法执行此操作,因为我们有一个 new MyOtherClass(),一旦流程到达此行,它就会创建一个新实例并转到 decodeAndGetName() API。 我需要的是,某种方法可以防止流程进入 decodeAndGetName() 并在上面的代码中遇到此调用时采用模拟值。

请告诉我一种方法。

最佳答案

我只将它与 Android 代码一起使用,但我认为您也许可以使用类似 Mockito 的东西使用类似于以下的代码在测试中模拟 MyOtherClass:

MyOtherClass mockMyOtherClass = Mockito.mock(MyOtherClass.class);
when(mockMyOtherClass.decodeAndGetName()).thenReturn(new String("known return value");

我还建议使用依赖注入(inject)并使用类似 Guice 的东西为了实现这一点。我每天在我的 Android 项目中结合使用 Guice 和 Mockito 来成功完成此类事情。

简单示例
使用 Guice 设置依赖注入(inject)后,您的代码可能如下所示:

MyOtherClassWrapper.java

@Singleton
public class MyOtherClassWrapper {

    private MyOtherClass myOtherClass = new MyOtherClass();

    public String decodeAndGetName() {
        return getMyOtherClass().decodeAndGetName();
    }

    ...

    private MyOtherClass getMyOtherClass() {
        return myOtherClass;
    }

}
<小时/>

MyClass.java

class MyClass {

    ...

    @Inject private MyOtherClassWrapper myOtherClassWrapper;

    ...

    public void myAPI() {
    ...
    String value = getMyOtherClassWrapper().decodeAndGetName();
    ...
    }

    private MyOtherClass getMyOtherClassWrapper() {
        return myOtherClassWrapper;
    }
}

请参阅Guice User's Guide有关如何开始设置 Guice 的信息。这并不太难。

关于java - 如何在运行 junit 测试用例时避免实际的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19920762/

相关文章:

java - Spring循环引用示例

java - 如何将 Python Script(py) 文件解析为 Java POJO?

java - 为 WireMock 构建 Java 项目

java - Java十进制格式问题

java - JSpinner 值变化事件

java - 双击执行 .jar 文件

java - 如何在 Java 中使用 PowerMockito 模拟接口(interface)

java - 如何测试没有抛出异常?

angularjs - 为什么 $log 总是被 angular-mocks 静音?

java - 模拟引用对象