![](/img/trans.png)
[英]Run robolectric and android unit test from Android studio
[英]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.