【发布时间】:2018-12-23 16:17:51
【问题描述】:
似乎@RequiredArgsConstructor 在下面的代码中不起作用
- 但仅在使用 Spock 框架的测试中,并且仅适用于接口类型为 Dao 的字段。
严格来说 - 代码可以工作,但我认为它不应该工作,考虑到 JUnit5 下的类似测试根本无法编译。
有人可以解释这是一个错误还是一个功能?
package brumba;
public interface Dao {
Integer getValueFor(Integer value);
}
package brumba;
import com.sun.istack.internal.NotNull;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class Brumba {
@NotNull
final private Dao dao;
// If you uncomment the below 2 lines, then the test fails
// @NotNull
// final private String name;
public Integer twice(Integer x){
return x * 2;
}
public Integer twiceDao(Integer x){
return dao.getValueFor(x);
}
}
下面的代码工作正常 - 但仅在 Spock 中(JUnit5 下的类似测试无法编译)。
似乎 Spock 测试以某种方式看到了默认的无参数构造函数(而 JUnit 测试没有看到这个构造函数)
但是,当上面的 2 条注释行未注释时,测试失败并出现以下错误:
groovy.lang.GroovyRuntimeException: Could not find matching constructor for: brumba.Brumba()
package brumba
import spock.lang.Specification
class BrumbaTest extends Specification {
def "twice should multiply argument by 2"() {
given:
def testedObject = new Brumba();
expect:
y == testedObject.twice( x )
where:
x | y
0 | 0
1 | 2
2 | 4
3 | 6
}
}
而且这个 JUnit 测试根本无法编译:
package brumba;
class BrumbaJUnit5Test {
@org.junit.jupiter.api.Test
void shouldTwice() {
Brumba br = new Brumba();
}
}
错误是:
Error:(7, 21) java: constructor Brumba in class brumba.Brumba cannot be applied to given types;
required: brumba.Dao,java.lang.String
found: no arguments
以下是我用于此项目的依赖项:
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.2-groovy-2.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.0-M1</version>
<scope>test</scope>
</dependency>
【问题讨论】:
-
我在
public class Brumba中看不到NoArgConstructor -
@Deadpool 你看不到 - java 编译器自动创建默认的无参数构造函数,除非定义了另一个构造函数。 Lombok
@RequiredArgsConstructor应该生成public Brumba(Dao dao)构造函数,所以在这种情况下,该类根本不应该有这个默认构造函数(它应该是私有的 - 隐藏的) - 但是 Spock 测试以某种方式看到了这个构造函数并且能够实例化这个对象使用此构造函数的类。 -
我知道了,但我不知道 spock
标签: java spock lombok intellij-lombok-plugin