2013-01-10 1 views
1

저는 의존성 주입 프레임 워크로 Dagger을 사용하고 있습니다. 그것은 지금까지 잘하고 있지만 안드로이드 단위 테스트를 위해 단검을 사용하는 동안 문제가 있는데 왜 (아마 대거 잘못된 사용 때문에) 알아낼 수 없습니다. 모듈 CSApplication $ ProdModule가의 생산 버전에서 사용되는그래프를 만들 때 대거가 NoSuchMethodException을 던집니다.

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 { 

     ... 
    } 
} 

참고 :

나는 다음과 같은 다음과 같은 예외를

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 

예외를 생성하는 코드입니다 데 응용 프로그램과 잘 작동합니다.

답변

3

ProdModule에 비공개 생성자가없는 인수를 부여해야합니다. 그리고 클래스는 정적이어야합니다. 이 단검이 없으면 모듈을 만들 수 없습니다.

1

args 액세스 가능한 (이 경우 공용) 생성자를 추가하거나 모듈의 인스턴스를 전달해야합니다. 인스턴스를 전달하지 않으면 Dagger가 모듈 자체를 구성해야하는데 액세스 할 수있는 인수가없는 생성자가없는 경우에는 수행 할 수 없습니다.

관련 문제