繁体   English   中英

无法在Android Studio中使用调试器运行Robolectric单元测试

[英]Unable to run Robolectric unit test with debugger in Android Studio

自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

我一直在编译设置中未选中使用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来反映新的调试港口?

我通过将数据库编译任务更改为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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM