【问题标题】:Unable to run Robolectric unit test with debugger in Android Studio无法在 Android Studio 中使用调试器运行 Robolectric 单元测试
【发布时间】:2014-10-28 16:55:57
【问题描述】:

自 0.6.1 版以来,我一直在 Android Studio 的调试器下成功运行 Robolectric 单元测试

现在我无法得到以下错误

ERROR: transport error 202: connect failed: Connection refused
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [../../../src/share/back/debugInit.c:750] 
Could not write standard input into: Gradle Test Executor 1.
java.io.IOException: Broken pipe

我一直在编译设置中未选中 use in-process build 标志,虽然我目前使用的是 AS 0.8-14,但我已经回去尝试了 0.8-11、0.8-9 和 0.6-1,但没有一个在工作,在忙。我正在使用 19.1.0 版的 android 构建工具(并且已经使用了一段时间,并且可以与它们一起使用)。

会不会是 Mac OS X 下的一些本地安全设置?如有任何帮助,我们将不胜感激。

** 更新 ** 我发现该问题是由在运行单元测试任务之前运行额外的 JavaExec 任务引起的。似乎 gradle 正在为第一个任务运行 JVM 并将调试参数传递给它,例如-agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=49807 任务完成,JVM 退出。 Gradle 然后运行实际的单元测试,并期望新的 JVM 在同一个端口上侦听以供调试器连接 - 它没有,因此会出现连接失败。

如何防止先前的任务(ormlite 数据库编译任务)在调试器下运行或强制 gradle 识别单元测试任务将使用新的 JVM 运行,因此更改单元测试的 jvmArgs 以反映新的调试端口?

【问题讨论】:

    标签: android unit-testing gradle android-studio robolectric


    【解决方案1】:

    我通过将数据库编译任务更改为 Exec 任务而不是 JavaExec 任务来解决此问题。 exec 任务定义如下,因此将数据库编译作为外部 java 进程执行,而不是 gradle 调用的进程。这可以防止调试 JVM 被数据库编译任务“消耗”。

    task (taskName type: Exec) {
        def mainClass = "com.some.class"
        def classPath = "${buildDir}/intermediates/classes/${flavorName}/${buildType.name}" + ":" + configurations.databaseCompile.asPath
        commandLine "java", "-cp", classPath, mainClass, configDirName
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      相关资源
      最近更新 更多