1

次のシナリオがあります。

内容が次のようMyClassな API を持つクラス:myAPI()

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

ここには、何らかの操作をMyOtherClass行う API が含まれています。decodeAndGetName()別のパッケージにあり、そのコードを変更できません。

要件

上記の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 に答える