我找到了sbt-groovy plugin,它恰当地编译了测试和主要来源。但是,definedTests
键始终为空; SBT从未发现任何常规测试。我已使用一个非常简单的单src/test/groovy/Test.groovy
验证了此问题,其中一个方法已注明@Test
,应该由junit-interface选取。
我认为问题的根源在于sbt-groovy插件需要在own plugin source code中定义任务“definedTests”。此任务提供Seq[TestDefinition]
。
查看SBT本身如何填充序列显示它使用了scala编译器的其他输出(这也适用于编译java文件,因此它可以直接用于java)在Analysis
类中填充来自IncrementalCompiler
我fiddled around with the taskdef,但我不确定我是否走在正确的道路上。关于这些内容的文档相当稀疏,或与IncrementalCompiler
密切相关。
在sbt-groovy中我需要使用什么代码来生成满足SBT的Seq[TestDefinition]
以便我可以运行用Groovy编写的测试(由junit-interface选取)?
答案 0 :(得分:2)
测试检测代码位于Tests.discover
,您可能会感兴趣。
看起来你需要的只是带有注释和子类列表的方法列表。
如果你有办法找到它们,你可能会模仿代码中发生的事情。
正如您所提到的,发现代码依赖于Analysis
数据类型,它是内部的肠道内容。
增量编译器。你或许可以利用它的事实
负责增量编译的sbt(不是Scala或Java编译器)。
对于Java编译,AnalyzingJavaCompiler.compile
调用编译器然后进行分析。
理论上,您可以定义使用相同机制的AnalyzingGroovyCompiler
作为用于Java编译的那个。从那以后,这不完全是在公园散步
一些部分隐藏在private[sbt]
后面。
简而言之,我总结了一个hacky概念验证,它将增量编译器与Groovy代码生成Analysis
进行了争论,并且能够检测到测试。
我只测试了一个简单的用例
import org.junit.Test
import org.junit.Assert
class Foo {
@Test
public void foo() {
Assert.assertEquals(1, 2)
}
}
从sbt运行test
会产生以下输出:
> test
[info] Start Compiling Test Groovy sources : /Users/xxx/sbt-2167-groovy/src/test/groovy
[error] Test Foo.foo failed: expected:<1> but was:<2>, took 0.062 sec
[error] Failed: Total 1, Failed 1, Errors 0, Passed 0
[error] Failed tests:
[error] Foo
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 1 s, completed Aug 23, 2015 5:05:01 AM
它可能不适用于sbt的未来版本。注意事项。