2015-04-03 80 views
1

我的所有项目活动都继承自一个CustomActivity,它是我创建的一个外部库,用于帮助我处理常见的用法。Robolectric NoClassDefFoundError与外部库

问题是,当我尝试测试与robolectric该活动我得到这个错误:

java.lang.NoClassDefFoundError: br/com/androidcore/activity/CustomActivity 

任何想法?我应该影子吗?我应该参考一些Robolectric配置吗?

这里是我的应用程序生成的文件:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "br.com.boozeprice" 
     minSdkVersion 14 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    defaultConfig { 
     testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner" 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:21.0.3' 
    compile 'com.android.support:support-v4:21.0.3' 

    compile project(':androidcore') 
    compile project(':persistencecore') 

    testCompile 'junit:junit:4.12' 
    testCompile 'org.robolectric:robolectric:2.4' 
} 

编辑,添加额外的信息:

我gradle这个版本:

dependencies { 
    classpath 'com.android.tools.build:gradle:1.1.3' 
    // NOTE: Do not place your application dependencies here; they belong 
    // in the individual module build.gradle files 
} 

我的测试:

@RunWith(CustomRobolectricRunner.class) 
public class IntegrationTest { 
    @Test 
    public void testActivity() { 
     Activity activity = Robolectric.setupActivity(MainActivity.class); 
     TextView txt = (TextView) activity.findViewById(R.id.txtMain); 
     String result = txt.getText().toString(); 
     assertThat(result, equalTo("Test")); 
    } 
} 

我CustomRunner:

public class CustomRobolectricRunner extends RobolectricTestRunner { 
    public CustomRobolectricRunner(Class<?> testClass) 
      throws InitializationError { 
     super(testClass); 
    } 

    @Override 
    protected AndroidManifest getAppManifest(Config config) { 
     String path = "src/main/AndroidManifest.xml"; 

     // android studio has a different execution root for tests than pure gradle 
     // so we avoid here manual effort to get them running inside android studio 
     if (!new File(path).exists()) { 
      path = "app/" + path; 
     } 

     config = overwriteConfig(config, "manifest", path); 
     return super.getAppManifest(config); 
    } 

    protected Config.Implementation overwriteConfig(
      Config config, String key, String value) { 
     Properties properties = new Properties(); 
     properties.setProperty(key, value); 
     return new Config.Implementation(config, 
       Config.Implementation.fromProperties(properties)); 
    } 

    @Override 
    protected SdkConfig pickSdkVersion(
      AndroidManifest appManifest, Config config) { 
     // current Robolectric supports not the latest android SDK version 
     // so we must downgrade to simulate the latest supported version. 
     config = overwriteConfig(config, "emulateSdk", "18"); 
     return super.pickSdkVersion(appManifest, config); 
    } 
} 

我的主要活动:

public class MainActivity extends CustomActivity 

自定义活动:

public abstract class CustomActivity extends Activity 

在此先感谢

+0

什么安卓gradle这个插件版本您使用? – 2015-04-03 07:30:13

+0

你能分享你的测试课吗? – 2015-04-03 07:30:44

+0

刚刚添加了额外的信息,谢谢。 – Gilson 2015-04-03 15:20:56

回答

-1

基础的问题是,robolectric不知道你在图书馆的资源。但是,这可以固定...

选项1:更新robolectric到3.0-RC2

删除您定制的运行。有一类新的RobolectricGradleTestRunner其解决资源装载于库依赖

选项2:从RobolectricGradleTestRunner

使用的解决方法从您的自定义robolectric亚军删除所有代码,并添加

public CustomRobolectricRunner(Class<?> testClass) throws InitializationError { 
    super(testClass); 
    String buildVariant = (BuildConfig.FLAVOR.isEmpty() ? "" : BuildConfig.FLAVOR+ "/") + BuildConfig.BUILD_TYPE; 
    String intermediatesPath = getClass().getResource("").toString().replace("file:", ""); 
    System.out.println(intermediatesPath); 
    intermediatesPath = intermediatesPath.substring(0, intermediatesPath.indexOf("/classes")); 

    System.setProperty("android.package", BuildConfig.APPLICATION_ID); 
    System.setProperty("android.manifest", intermediatesPath + "/manifests/full/" + buildVariant + "/AndroidManifest.xml"); 
    System.setProperty("android.resources", intermediatesPath + "/res/" + buildVariant); 
    System.setProperty("android.assets", intermediatesPath + "/assets/" + buildVariant); 
} 

对于一些例子请访问:

+1

我已经更新到robolectric 3.0-RC2和错误仍然存​​在,任何其他sugestion? – Gilson 2015-04-07 23:50:15

+0

我做了你所说的,现在它无法找到清单文件,我得到这个错误:.FileNotFoundException(AndroidManifest)和Robolectric不支持API级别1 – Gilson 2015-04-08 00:12:54

+0

看来,你不能在目录路径上有特殊字符,所以我已经改变,现在我只有这个错误: Resources $ NotFoundException ShadowAssetManager.getAndResolve 任何想法?它仍然是我的自定义acitivty androidcore.activity.CustomActivity.onCreate(CustomActivity.java:19) – Gilson 2015-04-08 00:16:59