【问题标题】:Android Instrumentation test does not find classes from library projectAndroid Instrumentation 测试未从库项目中找到类
【发布时间】:2015-03-30 00:50:57
【问题描述】:

因此,当我从 Android Studio 运行我的 Activity/instrumentation 测试时,在尝试从单元测试调用库模块中的方法的代码行上,我得到了一个 NoSuchMethodError

所以这是我的测试:

public class MainActivityTest extends ActivityInstrumentationTestCase2 {
    public void testMainActivity() {
        final MainActivity target = (MainActivity) getActivity();
        MyLibarary.someStaticMethod(); // yields java.lang.NoSuchMethodError
}

这里有什么问题?我已将我的库定义为 build.gradle 中的“编译”依赖项,并且它编译得很好。该库也可以毫无问题地从主应用程序类中调用。只有当我从测试中调用它时它才会失败。我的应用和我的测试在同一个模块中。

我尝试过手动运行 clean 任务、assembleDebug 和 assembleDebugTest 任务。没用。

项目结构:

Root
 |---MyApp 
 |     |---src/main/...
 |     |---src/androidTest/...
 |----MyLibrary

运行 Android Studio v1.0.2 Gradle 构建工具 v1.0.0 使用默认 Instrumentation 测试运行器在 AS 的运行/调试配置中作为模块“MyApp”上的“Android 测试”运行。

【问题讨论】:

  • 在 Eclipse>>项目属性>>Android>> 确保您正在测试的项目在库下被引用。 'is library' 可以保持未选中状态
  • 这两个都没有真正命名 - 我匿名了 SO 的代码。但这不是问题——如果我有语法错误,代码就不会编译。它编译,但运行时失败
  • 抱歉,我在您回复时编辑了我的评论。大多数有关该主题的帖子都说您正在找到该库的两个版本,一个在编译期间,另一个在运行时。
  • 我可能应该停止评论。我刚刚看到您使用的是 Studio 而不是 Eclipse。哇!
  • 哈哈,谢谢你的尝试:)

标签: android android-testing


【解决方案1】:

好吧,这个有点棘手。关键字:proguard minify。由于到目前为止新实现的方法被仪器测试使用,proguard 没有了解它的使用情况,因此在 proguardDebugTest 构建步骤中将其从 DEX 中删除。

解决方案:要么在调试版本中禁用缩小(在 gradle 中:android.buildTypes.debug.minifyEnabled false),要么在主应用程序中使用该方法。

【讨论】:

  • 啊有趣。未发布导致问题的方法与 InstrumentationTestCase 无关。不过很好!
【解决方案2】:

Gradle 并不是最新的。但我认为如果尝试编写仪器测试,我们应该在 build.gradle 中指定 testCompileandroidTestCompile 依赖项。

有用的链接:

http://gradle.org/docs/current/userguide/java_plugin.html

Specifying test dependencies with the Gradle Android build system

希望对你有帮助

【讨论】:

  • 只有对测试的依赖exlusive,比如junit,应该这样指定。我的主应用程序已经通过“编译”到库中具有依赖关系,因此没有必要再次引用它。解决方案虽然与 proguard 有关 - 请参阅我的其他答案
猜你喜欢
  • 2015-03-13
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多