如何用 Spock 测试 Java class?
How to test Java class with Spock?
我正在尝试使用 spock 在 Java 中测试 class。我对它很陌生。
public class VerifyUser {
private final ServiceFacade serviceFacade;
//here is constructor
@RequestMapping(name = "verifyUser",
path = "/verifyuser",
method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE,
consumes = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<VerifyUserResponse> verifyUser(@RequestBody VerifyUserRequest request) {
serviceFacade.getRiskProfile(user.userId.id)
.flatMap(ServiceFacade.RiskProfile::getAffordabilityCheck)
.ifPresent(ac -> {
String rg = ac.getRiskGroup().name();
VerifyUserResponse.VerifyUserResponseBuilder vur = VerifyUserResponse.builder();
vur.attributes.put("RiskGroup", rg);
});
现在我应该测试这个 class 看看如果我得到的 riskProfile
在那里会发生什么。
我是从这样开始的:
def "should verify user"() {
given:
def userId = "12345"
when:
def res = mvc.perform(post(url)
.content(json)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andReturn()
.response
then: 1 * serviceFacade.getRiskProfile(user.userId.id) >> new ServiceFacade.RiskProfile("userId", 0, Instant.now(), Optional.empty(), Optional.empty())
RiskProfile.java class 看起来像这样:
public class RiskProfile {
public final UserId userId;
public final long version;
public final Instant created;
public final Optional<Instant> lastUpdated;
public final Optional<AffordabilityCheck> affordabilityCheck;
public RiskProfile(UserId userId, long version, Instant created, Optional<Instant> lastUpdated,
Optional<AffordabilityCheck> affordabilityCheck) {
Validation.notNull(userId, "userId can not be null");
Validation.notNull(created, "created can not be null");
Validation.notNull(lastUpdated, "lastUpdated can not be null");
Validation.notNull(affordabilityCheck, "affordabilityCheck can not be null");
this.userId = userId;
this.version = version;
this.created = created;
this.lastUpdated = lastUpdated;
this.affordabilityCheck = affordabilityCheck;
}
public static RiskProfile create(UserId userId) {
return new RiskProfile(userId, 0, Instant.now(), Optional.empty(), Optional.empty());
}
public static RiskProfile create(UserId userId, Optional<AffordabilityCheck> affordabilityCheck) {
return new RiskProfile(userId, 0, Instant.now(), Optional.empty(), affordabilityCheck);
}
当我尝试 运行 我的测试时,我得到:
Could not find matching constructor for: com.example.ServiceFacade$RiskProfile(String, String, Optional)
groovy.lang.GroovyRuntimeException: Could not find matching constructor for: com.example.ServiceFacade$RiskProfile(String, String, Optional)
您正在调用以下内容:
new ServiceFacade.RiskProfile("userId", 0, Instant.now(), Optional.empty(), Optional.empty())
RiskProfile
构造函数的第一个参数需要是 UserId
,而不是 String
。
我正在尝试使用 spock 在 Java 中测试 class。我对它很陌生。
public class VerifyUser {
private final ServiceFacade serviceFacade;
//here is constructor
@RequestMapping(name = "verifyUser",
path = "/verifyuser",
method = RequestMethod.POST,
produces = MediaType.APPLICATION_JSON_VALUE,
consumes = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<VerifyUserResponse> verifyUser(@RequestBody VerifyUserRequest request) {
serviceFacade.getRiskProfile(user.userId.id)
.flatMap(ServiceFacade.RiskProfile::getAffordabilityCheck)
.ifPresent(ac -> {
String rg = ac.getRiskGroup().name();
VerifyUserResponse.VerifyUserResponseBuilder vur = VerifyUserResponse.builder();
vur.attributes.put("RiskGroup", rg);
});
现在我应该测试这个 class 看看如果我得到的 riskProfile
在那里会发生什么。
我是从这样开始的:
def "should verify user"() {
given:
def userId = "12345"
when:
def res = mvc.perform(post(url)
.content(json)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andReturn()
.response
then: 1 * serviceFacade.getRiskProfile(user.userId.id) >> new ServiceFacade.RiskProfile("userId", 0, Instant.now(), Optional.empty(), Optional.empty())
RiskProfile.java class 看起来像这样:
public class RiskProfile {
public final UserId userId;
public final long version;
public final Instant created;
public final Optional<Instant> lastUpdated;
public final Optional<AffordabilityCheck> affordabilityCheck;
public RiskProfile(UserId userId, long version, Instant created, Optional<Instant> lastUpdated,
Optional<AffordabilityCheck> affordabilityCheck) {
Validation.notNull(userId, "userId can not be null");
Validation.notNull(created, "created can not be null");
Validation.notNull(lastUpdated, "lastUpdated can not be null");
Validation.notNull(affordabilityCheck, "affordabilityCheck can not be null");
this.userId = userId;
this.version = version;
this.created = created;
this.lastUpdated = lastUpdated;
this.affordabilityCheck = affordabilityCheck;
}
public static RiskProfile create(UserId userId) {
return new RiskProfile(userId, 0, Instant.now(), Optional.empty(), Optional.empty());
}
public static RiskProfile create(UserId userId, Optional<AffordabilityCheck> affordabilityCheck) {
return new RiskProfile(userId, 0, Instant.now(), Optional.empty(), affordabilityCheck);
}
当我尝试 运行 我的测试时,我得到:
Could not find matching constructor for: com.example.ServiceFacade$RiskProfile(String, String, Optional)
groovy.lang.GroovyRuntimeException: Could not find matching constructor for: com.example.ServiceFacade$RiskProfile(String, String, Optional)
您正在调用以下内容:
new ServiceFacade.RiskProfile("userId", 0, Instant.now(), Optional.empty(), Optional.empty())
RiskProfile
构造函数的第一个参数需要是 UserId
,而不是 String
。