1

我有以下情况。

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

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

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

要求

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

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

请让我知道一种方法来做到这一点。

4

1 回答 1

1

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

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

我还建议使用依赖注入并使用Guice之类的东西来实现这一点。我每天都在我的 Android 项目中使用 Guice 和 Mockito 的组合来成功完成这类事情。

简要示例
以下是您的代码在使用 Guice 设置依赖注入后的样子:

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 的信息,请参阅Guice 用户指南。这不是太难。

于 2013-11-12T04:26:52.990 回答