2017-01-13 8 views
1

TestModuleクラスを作成してテスト実装クラスを挿入しましたが、classCastExceptionで失敗します。RoboGuiceのAndroid搭載モジュールがテストで動作しない

私はRobolectric 2.4を使用しています。ここで

はここでカスタムrobolectricランナー

public class AppApplicationTest extends MyApplication { 

@Override 
protected void attachBaseContext(Context base) { 
    configureModuleInjection(); 
    System.out.println(this.getClass().getSimpleName() + " attached and initialised AppApplicationTest "); 

    try { 
     MultiDex.install(base); 
     super.attachBaseContext(base); 
    } catch (RuntimeException ignored) { 
     // Multidex support doesn't play well with Robolectric yet 
     System.out.println(this.getClass().getSimpleName() + " runtime exception = " + ignored.toString()); 
    } 
} 

private void configureModuleInjection() { 
//fails below with classCastException 
    RoboGuice.getOrCreateBaseApplicationInjector(this, 
      RoboGuice.DEFAULT_STAGE, 
      RoboGuice.newDefaultRoboModule(this), 
      new TestModule()); 
} 
} 

経由で作成された私のカスタムTestApplicationは私のカスタムRobolectricTestRunner

public class MyRoboTestRunner extends RobolectricTestRunner { 

    .... 

    @Override 
    protected Class<? extends TestLifecycle> getTestLifecycleClass() { 
     return ApplicationTest.class; 
    } 

    public static class ApplicationTest extends DefaultTestLifecycle{ 
     @Override 
     public Application createApplication(Method method, AndroidManifest appManifest, Config config) { 
      return new AppApplicationTest(); 
     } 
    } 

    @Override 
    protected ClassLoader createRobolectricClassLoader(Setup setup, SdkConfig sdkConfig) { 
     return super.createRobolectricClassLoader(new ExtraShadows(setup), sdkConfig); 
    } 

    class ExtraShadows extends Setup{ 
     private Setup setup; 

     public ExtraShadows(Setup setup) { 
      this.setup = setup; 
     } 

     @Override 
     public boolean shouldInstrument(ClassInfo classInfo) { 
      boolean shouldInstrument = setup.shouldInstrument(classInfo); 
      return shouldInstrument || classInfo.getName().equals(MultiDex.class.getName()); 
     } 
    } 
} 

がここであるフルスタックトレースエラーが

ある
WARNING: no system properties value for ro.build.date.utc 
java.lang.ClassNotFoundException: AnnotationDatabaseImpl 
    at org.robolectric.bytecode.AsmInstrumentingClassLoader.getByteCode(AsmInstrumentingClassLoader.java:172) 
    at org.robolectric.bytecode.AsmInstrumentingClassLoader.findClass(AsmInstrumentingClassLoader.java:126) 
    at org.robolectric.bytecode.AsmInstrumentingClassLoader.loadClass(AsmInstrumentingClassLoader.java:98) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:191) 
    at com.google.inject.AnnotationDatabaseFinder.getAnnotationDatabaseInstance(AnnotationDatabaseFinder.java:73) 
    at com.google.inject.AnnotationDatabaseFinder.<init>(AnnotationDatabaseFinder.java:36) 
    at com.google.inject.Guice.setAnnotationDatabasePackageNames(Guice.java:133) 
    at roboguice.RoboGuice.initializeAnnotationDatabaseFinderAndHierarchyTraversalFilterFactory(RoboGuice.java:288) 
    at roboguice.RoboGuice.getOrCreateBaseApplicationInjector(RoboGuice.java:113) 
    at com.jr.AppApplicationTest.configureModuleInjection(AppApplicationTest.java:33) 
    at com.jr.AppApplicationTest.attachBaseContext(AppApplicationTest.java:20) 
    at android.app.Application.$$robo$$Application_0b64_attach(Application.java:181) 
    at android.app.Application.attach(Application.java) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.robolectric.internal.ReflectionHelpers$3.run(ReflectionHelpers.java:64) 
    at org.robolectric.internal.ReflectionHelpers.traverseClassHierarchy(ReflectionHelpers.java:114) 
    at org.robolectric.internal.ReflectionHelpers.callInstanceMethodReflectively(ReflectionHelpers.java:59) 
    at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:119) 
    at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:440) 
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:222) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:158) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runners.Suite.runChild(Suite.java:128) 
    at org.junit.runners.Suite.runChild(Suite.java:27) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
java.lang.IllegalStateException: Unable to use annotation database(s) 
    at roboguice.RoboGuice.initializeAnnotationDatabaseFinderAndHierarchyTraversalFilterFactory(RoboGuice.java:292) 
    at roboguice.RoboGuice.getOrCreateBaseApplicationInjector(RoboGuice.java:113) 
    at com.jr.AppApplicationTest.configureModuleInjection(AppApplicationTest.java:33) 
    at com.jr.AppApplicationTest.attachBaseContext(AppApplicationTest.java:20) 
    at android.app.Application.attach(Application.java:181) 
    at org.robolectric.internal.ReflectionHelpers$3.run(ReflectionHelpers.java:64) 
    at org.robolectric.internal.ReflectionHelpers.traverseClassHierarchy(ReflectionHelpers.java:114) 
    at org.robolectric.internal.ReflectionHelpers.callInstanceMethodReflectively(ReflectionHelpers.java:59) 
    at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:119) 
    at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:440) 
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:222) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:158) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runners.Suite.runChild(Suite.java:128) 
    at org.junit.runners.Suite.runChild(Suite.java:27) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

答えて

0

ので、この行の java.lang.IllegalStateExceptio n:注釈データベースを使用できません

RoboGuice.setUseAnnotationDatabases(false)を使用できますか?

private void configureModuleInjection() { 

    RoboGuice.setUseAnnotationDatabases(false); 

    RoboGuice.getOrCreateBaseApplicationInjector(this, 
     RoboGuice.DEFAULT_STAGE, 
     RoboGuice.newDefaultRoboModule(this), 
     new TestModule()); 

}

関連する問題