【发布时间】:2021-06-18 13:37:21
【问题描述】:
假设以下 POJO:
@Getter
@Setter
public class UserRequest {
private String username;
private String password;
private String email;
}
现在我想为这个类生成各种测试数据。每当没有明确设置某些字段时,应设置默认值。请记住,我不能将 Lombok 的 @Builder 或 @Builder.Default 添加到原始类或以其他方式修改它。
所以我想出了以下帮助类:
public class UserRequestTestDataUtils {
public static final String DEFAULT_USERNAME = "foo";
public static final String DEFAULT_PASSWORD = "bar";
public static final String DEFAULT_EMAIL = "foo@bar.com";
public static UserRequest createUserRequestWithUsername(String username) {
return createUserRequest(username, DEFAULT_PASSWORD, DEFAULT_EMAIL);
}
public static UserRequest createUserRequestWithPassword(String password) {
return createUserRequest(DEFAULT_USERNAME, password, DEFAULT_EMAIL);
}
public static UserRequest createUserRequestWithEmail(String email) {
return createUserRequest(DEFAULT_USERNAME, DEFAULT_PASSWORD, email);
}
public static UserRequest createUserRequestWithUsernameAndPassword(String username, String password) {
return createUserRequest(username, password, DEFAULT_EMAIL);
}
public static UserRequest createUserRequest(String username, String password, String email) {
final UserRequest userRequest = new UserRequest();
userRequest.setUsername(username);
userRequest.setPassword(password);
userRequest.setEmail(email);
return userRequest;
}
}
虽然这对于只有一些字段的类来说是可以的,但如果有更多字段并且对于测试数据的某些变体,它就会变得乏味。
我的第一个想法是在createUserRequest()的方法级别上使用Lombok的@Builder:
@Builder
public static UserRequest createUserRequest(String username, String password, String email) {
final UserRequest userRequest = new UserRequest();
userRequest.setUsername(username);
userRequest.setPassword(password);
userRequest.setEmail(email);
return userRequest;
}
这将允许以下内容:
UserRequestTestDataBuilder.builder()
.username("foo")
.password("bar")
.build();
但是,这不会为(在本例中为 email)设置任何默认值。是否有一些模式可以简化这种方法?
【问题讨论】: