これを行う方法の例は見つかりませんでした。次のような例に基づいて、それは不可能だと思います。
@Bean(MyImplementation.class)
MyInterface myInterface;
注入するクラスはすでに決定されています。
これを行う方法の例は見つかりませんでした。次のような例に基づいて、それは不可能だと思います。
@Bean(MyImplementation.class)
MyInterface myInterface;
注入するクラスはすでに決定されています。
ジョンカールの回答への補足:
実際のオブジェクトではなくモックを注入することを AndroidAnnotations に伝える方法はありません。これはコンパイル時に機能するため、コードは常に本番環境に対応している必要があります。
Robolectricを補完して、生成されたアクティビティをテストすることをお勧めします。注釈はコードに動作を追加しているため、注釈がないかのようにテストしないでください。
AndroidAnnotations の動作ではなく、アクティビティの動作をテストすることに注意してください。フレームワークには、注釈が正しく機能することを確認するための独自のテストが既にあります:)。
AndroidAnnotations DI を実行させてから、モックされた依存関係を再注入できます。フィールドには少なくとも既定のスコープがあります。つまり、同じパッケージからアクセスできるため、アクティビティと同じパッケージでテストを作成する必要があります。
MyActivity_ activity = new MyActivity_();
// myInterface gets injected
activity.onCreate(null);
// you reinject myInterface
activity.myInterface = Mockito.mock(MyInterface.class);
AndroidAnnotations では、依存関係は を呼び出すことによって注入されMyImplementation_.getInstance_()
ます。PowerMockなどのツールでランタイム バイトコード操作を使用して、getInstance_()
メソッドがMyImplementation_
モックを返すようにすることができます。ただし、PowerMock テスト ランナーと Robolectric テスト ランナーを混在させる必要があるため、初期作業が必要になる場合があります。
編集:この質問に基づいた内容でドキュメントを更新しました。
問題は、単体テストですか、それとも統合テストですか。
単体テストを行う場合は、セッターを使用し、依存性注入フレームワークを使用せずにJavaコードをテストすることで、昔ながらの方法でモックを使用することをお勧めします。これにより、クラスを個別にテストし、多くの複雑さを回避できます。
私が意味したのは:
public class Test{
ClassInTest inTest;
MyInterface myInterface;
@Before
public void setup(){
inTest = new ClassInTest();
//or your favorite mocking frameowrk
myInterface = EasyMock.createMock(MyInterface.class);
inTest.setMyInterface(myInterface);
}
@Test
public void testMethod(){
//...mocking test code
}
}
もちろん、スタブと最終的なクラス/メソッドをスローする例外があるため、Androidアクティビティ(およびAndroidの他の拡張機能)のテストは困難です。ここで、RobolectricがAndroid APIのインスタンス化/シャドウイングに役立ちます(そして強くお勧めします)。
統合テストを行っている場合は、別のアプローチを取ることをお勧めします。個人的には、本番環境で実行されるようにアプリケーションをテストしようとするため、統合テスト中にモックを作成しないようにします。ただし、本当にモックを作成したい場合は、単体テストと同様のアプローチを使用して、生成されたActivityクラスを立ち上げた後にモックを導入できます。注目に値するのは、 Robotiumなどのフレームワークを使用して、ハードウェア上で直接統合テストを実行できることです。
あなたの質問にもっと、私は特にモックを注入したり、アプリケーションの注入された依存性ツリーにモックを導入したりするためのAndroidAnnotationsの機能を知りません。