我正在和Spock一起编写单元测试。我想使用spock检查数组的所有元素
when: then:
块。我从接受的答案中找到了语法here。并基于此我写了这样的东西 -
then:
myArray.every { (it >= 0) && (it < 10) }
这适用于IntelliJ,但是当我使用Ant构建测试时,它会失败。
Ant和groovy设置 - 取自here。我可以看到它适用于像myArray.length == 8这样的简单条件。
Groovy版本 - 2.4.5
Spock版本 - spock-core-1.0-groovy-2.4.jar
JDK 1.8
Ant 1.9.6
错误 -
[junit] Testcase: initializationError took 0 sec
[junit] Caused an ERROR
[junit] Test class should have exactly one public zero-argument constructor
[junit] java.lang.Exception: Test class should have exactly one public zero-argument constructor
[junit] at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
[junit]
[junit] Testcase: initializationError took 0 sec
[junit] Caused an ERROR
[junit] No runnable methods
[junit] java.lang.Exception: No runnable methods
[junit] at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
[junit]
[junit] Test package.MyTest$__spock_feature_0_0_closure1 FAILED
在查看由ant build创建的类文件时,我看到了
public void $spock_feature_0_0(Object obj){
...
...
class __spock_feature_0_0_closure1 extends Closure implements GeneratedClosure {
}
...
...
new __spock_feature_0_0_closure1()
}
所以看起来使用Reflection无法访问闭包!!有什么想法吗? 我的蚂蚁groovy配置是否搞砸了(正如我之前所说,更简单的测试对我有用,所以我希望不会!)?或者我只是期待Spock的过多。
场景的一个例子 -
public class SpockTest extends Specification{
public def "example"(){
given:
int[] arr = new int[5];
when:
arr[0] = 1;
then:
arr.every { (it >= 0) }
}
}
junit下面也无法运行相同的错误 -
public class TestClass {
public int test1() {
class testInner {//local class
int a = 100;
public int getA() {
return a;
}
}
return new testInner().getA();
}
@Test
public void test2() {
System.out.println(test1());
assert 100 == test1();
}
}
更新(29-Feb-16) - 到目前为止的讨论中,似乎问题出在Ant身上。只有使用/编译到本地类的junit和groovy / Spock测试才会出错。更简单的案例工作正常。