Unit testing 如何在Gradle中指定类路径顺序

Unit testing 如何在Gradle中指定类路径顺序,unit-testing,gradle,robolectric,Unit Testing,Gradle,Robolectric,我需要控制testRuntime配置中JAR的顺序 我必须确保roblectric-x.x.jar在android.jar之前出现,否则我会遇到可怕的运行时异常(“Stub!”) 我该怎么做?这可能会起作用: configurations { robo } dependencies { robo ... testRuntime ... } sourceSets.test.runtimeClasspath = configurations.robo + sourceSets.test.

我需要控制testRuntime配置中JAR的顺序

我必须确保roblectric-x.x.jar在android.jar之前出现,否则我会遇到可怕的运行时异常(“Stub!”)

我该怎么做?

这可能会起作用:

configurations { robo }

dependencies {
  robo ...
  testRuntime ...
}

sourceSets.test.runtimeClasspath = configurations.robo + sourceSets.test.runtimeClasspath

以下是我完整的build.gradle,用于针对我的Android应用程序运行机器人分子测试,该应用程序使用RoboGuice:

apply插件:“java”
androidJar=新文件(System.getenv('ANDROID_HOME'),'/platforms/ANDROID-7/ANDROID.jar')
配置{robo}
依赖关系{
机器人('com.pivotallabs:robollectric:1.0-RC1')
testCompile('org.roboguice:roboguice:1.1.2')
testCompile('junit:junit:4.8.2')
testCompile项目(“:app”)
testCompile文件(androidJar)
}
sourceset.test.compileClasspath=configurations.robo+sourceset.test.compileClasspath
sourceSets.test.runtimeClasspath=configurations.robo+sourceSets.test.runtimeClasspath
试验{
排除=['**/MyRobolectrictTestRunner.class']
}
我必须为测试运行者添加一个排除,否则Gradle将抛出一个异常

MyRobolectrictTestRunner.java如下所示:

package com.acme.myapp;
导入java.io.File;
导入org.junit.runners.model.InitializationError;
导入roboguice.application.RoboApplication;
导入roboguice.inject.ContextScope;
导入com.google.inject.Injector;
导入com.xtremelabs.roblectric.roblectric;
导入com.xtremelabs.roblectric.roblectrictestrunner;
公共类MyRobolectrictTestRunner扩展了RobolectrictTestRunner{
公共MyRobolectrictTestRunner(类testClass)引发初始化错误{
//告诉Robolectric在哪里可以找到AndroidManifest.xml和res/
超级(testClass,新文件(“../app”);
}
/**
*也可以在测试中启用注入。。。
*/
@凌驾
公共无效准备测试(对象测试){
RoboApplication myApplication=(RoboApplication)RoboApplication.application;
Injector=myApplication.getInjector();
ContextScope=injector.getInstance(ContextScope.class);
输入(myApplication);
注入器.注入器构件(试验);
}
}
下面是一个示例测试,演示了注射:

package com.acme.myapp;
导入静态org.junit.Assert.assertEquals;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入roboguice.inject.InjectResource;
@RunWith(MyRobolectrictTestRunner.class)
公共类StringFormattingTest{
@注入资源(R.string.info\u待定金额)
私有字符串模式;
@试验
public void testFormatInfoPendingAmount(){
字符串s=String.format(PendingMountPattern,20.0d,“EUR”);
assertEquals(“仅接受部分股权(20,00欧元)”;
}
}

文档中是否说robolectric jar必须位于类路径上的android.jar之前?是的。在Robolectric主页上:“疑难解答java.lang.RuntimeException:Stub!确保Robolectric及其依赖项出现在类路径中的Android API jar之前。”它在Eclipse中工作,因为可以显式控制类路径的顺序。Eclipse项目是由Gradle生成的。您可以按照Gradle依赖项的顺序来解决它,但要注意两条优先级更高的规则!我不得不将机器人添加到compileClasspath中well@Peter你知道如何…如何引用你的:应用程序吗?通过它自己的设置。gradle?应用程序是否也公开了它自己的依赖项以供测试使用?我们可以在github上获得一个简单的示例吗?