2

依存性注入フレームワークとしてDaggerを使用しています。これまでのところ問題なく動作していますが、Android 単体テストに Dagger を使用しているときに問題が発生し、その理由がわかりません (おそらく Dagger の誤った使用が原因です)。

次の例外があります

java.lang.IllegalArgumentException: Failed to construct com.couchsurfing.mobile.android.CSApplication$ProdModule
at dagger.internal.plugins.reflect.ReflectiveModuleAdapter.newModule(ReflectiveModuleAdapter.java:94)
at dagger.internal.RuntimeAggregatingPlugin.getModuleAdapter(RuntimeAggregatingPlugin.java:99)
at dagger.internal.RuntimeAggregatingPlugin.collectIncludedModulesRecursively(RuntimeAggregatingPlugin.java:85)
at dagger.internal.RuntimeAggregatingPlugin.getAllModuleAdapters(RuntimeAggregatingPlugin.java:71)
at dagger.ObjectGraph.makeGraph(ObjectGraph.java:115)
at dagger.ObjectGraph.create(ObjectGraph.java:103)
at com.couchsurfing.mobile.android.core.MessageManagerTest.setUp(MessageManagerTest.java:34)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1661)
Caused by: java.lang.NoSuchMethodException: <init> []
at java.lang.Class.getConstructorOrMethod(Class.java:460)
at java.lang.Class.getDeclaredConstructor(Class.java:588)
at dagger.internal.plugins.reflect.ReflectiveModuleAdapter.newModule(ReflectiveModuleAdapter.java:88)
... 15 more

例外を生成するコードは次のとおりです。

public class MessageManagerTest extends InstrumentationTestCase {

    @Inject
    MessageManager mMessageManager;

    @Inject
    MessageOperations.Factory mMOFactory;

    @Inject
    Context mAppContext;

    @Override
    public void setUp() {
        ObjectGraph.create(new TestModule()).inject(this);
    }

    @Module(
        includes = CSApplication.ProdModule.class,
        entryPoints = MessageManagerTest.class,
        overrides = true)
    static class TestModule {
        @Provides
        MessageOperations.Factory provideMessageOperationsFactory() {
            return Mockito.mock(MessageOperations.Factory.class);
        }

        @Provides
        Context provideAppContext() {
            return Mockito.mock(Context.class);
        }
    }

    public void testCreateMessage() throws RemoteException, OperationApplicationException {

      ...
    }
}

モジュールCSApplication$ProdModuleは、アプリケーションの製品版で使用され、適切に機能することに注意してください。

4

2 に答える 2

3

ProdModule に引数なしの非プライベート コンストラクターを指定する必要があります。また、クラスは静的である必要があります。この短剣がなければ、モジュールを構築できません。

于 2013-01-11T01:35:54.970 に答える
1

引数なしでアクセス可能な (この場合は public) コンストラクターを追加するか、モジュールのインスタンスを渡す必要があります。インスタンスを渡さない場合、Dagger はモジュール自体を構築する必要がありますが、アクセス可能な引数なしのコンストラクターがない場合は構築できません。

于 2013-01-11T16:09:57.520 に答える