2014-05-17 54 views
2

我下載了deckard-gradle項目,並且我創建了自己的這個寺廟。無法使用Gradle和Android Studio運行Robolectric測試 - 找不到StyleData

我的問題是Robolectric.2.3不想運行測試類。

這是我的錯誤:

java.lang.RuntimeException: huh? can't find parent for StyleData{name='AppTheme', parent='Theme_AppCompat_Light_DarkActionBar'} 
    at org.robolectric.shadows.ShadowAssetManager$StyleResolver.getParent(ShadowAssetManager.java:365) 
    at org.robolectric.shadows.ShadowAssetManager$StyleResolver.getAttrValue(ShadowAssetManager.java:350) 
    at org.robolectric.shadows.ShadowResources.findAttributeValue(ShadowResources.java:293) 
    at org.robolectric.shadows.ShadowResources.attrsToTypedArray(ShadowResources.java:196) 
    at org.robolectric.shadows.ShadowResources.access$000(ShadowResources.java:55) 
    at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:494) 
    at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:489) 
    at org.robolectric.shadows.ShadowResources$ShadowTheme.obtainStyledAttributes(ShadowResources.java:484) 
    at android.content.res.Resources$Theme.obtainStyledAttributes(Resources.java) 
    at android.content.Context.obtainStyledAttributes(Context.java:380) 
    at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:104) 
    at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98) 
    at pl.grzeslowski.historia_miasta.activities.MainActivity_.onCreate(MainActivity_.java:31) 
    at android.app.Activity.performCreate(Activity.java:5133) 
    at org.fest.reflect.method.Invoker.invoke(Invoker.java:112) 
    at org.robolectric.util.ActivityController$1.run(ActivityController.java:147) 
    at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:265) 
    at org.robolectric.util.ActivityController.create(ActivityController.java:144) 
    at org.robolectric.util.ActivityController.create(ActivityController.java:154) 
    at pl.grzeslowski.historia_miasta.activities.MainActivityTest.testSomething(MainActivityTest.java:21) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:250) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:177) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:69) 
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:50) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) 
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) 
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) 
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:103) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:355) 
    at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 
+1

對此有何進展?我嘗試了https://github.com/robolectric/robolectric/issues/979中的最後一條評論,但仍然失敗。 – sancho21

回答

0

我遇到類似的問題,RobolectricTestRunner找不到的Android庫的依賴。爲了解決這個問題,你需要擴展RobolectricTestRunner來把它們拉入.android-maven-plugin根據插件的版本將你的APK依賴項解壓到「target/unpack/apklibs」或者「target/unpacked-libs」。我粘貼下面的例子解決了第二個問題。

public class MyTestRunner extends RobolectricTestRunner { 

    public MyTestRunner(Class<?> testClass) throws InitializationError { 
     super(testClass); 
    } 

    @Override 
    protected AndroidManifest createAppManifest(FsFile manifestFile, FsFile resDir, FsFile assetsDir) { 
     return new MavenAndroidManifest(manifestFile, resDir, assetsDir); 
    } 

    public static class MavenAndroidManifest extends AndroidManifest { 
     public MavenAndroidManifest(FsFile androidManifestFile, FsFile resDirectory, FsFile assetsDirectory) { 
      super(androidManifestFile, resDirectory, assetsDirectory); 
     } 

     public MavenAndroidManifest(FsFile libraryBaseDir) { 
      super(libraryBaseDir); 
     } 

     @Override 
     protected List<FsFile> findLibraries() { 
      // Change "target/unpacked-libs" to "target/unpack/apklibs" 
      //if youe have older version of android-maven-plugin 
      FsFile unpack = getBaseDir().join("target/unpacked-libs"); 
      if (unpack.exists()) { 
       FsFile[] libs = unpack.listFiles(); 
       if (libs != null) { 
        return Arrays.asList(libs); 
       } 
      } 
      return Collections.emptyList(); 
     } 

     @Override 
     protected AndroidManifest createLibraryAndroidManifest(FsFile libraryBaseDir) { 
      return new MavenAndroidManifest(libraryBaseDir); 
     } 
    } 
} 

後來在測試用例使用這樣的:

@RunWith(MyTestRunner.class) 
@Config(emulateSdk = 18) 
public class MyActivityTest{ 
} 
相關問題