Assume the following POJO:
@Getter
@Setter
public class UserRequest {
private String username;
private String password;
private String email;
}
Now I'd like to generate various test data for this class. Whenever some field is not set explicitly, a default value shall be set. Please bear in mind that I cannot add Lombok's @Builder
or @Builder.Default
to the original class or modify it in other ways.
So I came up with the following helper class:
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;
}
}
While this is ok for classes with only some fields, it gets tedious if there are more fields and for certain variations of the test data.
My first idea was to use Lombok's @Builder
on the method level for createUserRequest()
:
@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;
}
Which would allow the following:
UserRequestTestDataBuilder.builder()
.username("foo")
.password("bar")
.build();
However, this doesn't set any default value for (in this case email
). Is there some pattern which could simplify this approach?