使用辅助方法为 Java 对象生成测试数据时提供默认值

2024-01-10

假设有以下 POJO:

@Getter
@Setter
public class UserRequest {
    private String username;
    private String password;
    private String email;
}

现在我想为这个类生成各种测试数据。当某些字段没有明确设置时,应设置默认值。请记住我无法添加龙目岛@Builder or @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 = "[email protected] /cdn-cgi/l/email-protection";

    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;
    }
}

虽然这对于只有一些字段的类来说是可以的,但如果有更多字段并且对于测试数据的某些变化,它就会变得乏味。

我的第一个想法是使用 Lombok 的@Builder在方法级别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;
}

这将允许以下操作:

UserRequestTestDataBuilder.builder()
  .username("foo")
  .password("bar")
  .build();

但是,这不会设置任何默认值(在本例中email)。是否有某种模式可以简化这种方法?


实际上,您可以通过 util 类中的一些解决方法以及注释的方法来实现此目的@Builder添加与 lombok 生成的构建器类同名的以下类。

public class UserRequestTestDataUtils {
    // leave this method as such, without any null checks.
    @Builder
    public static UserRequest newUserRequest(String username, String password, String email) {
        UserRequest ur = new UserRequest();
        ur.setUsername(username);
        // etc
        return ur;
    }

    // Provide the default values here.
    public static class UserRequestBuilder {
        private String username = "foo";
        private String password = "bar";
        private String email = "[email protected] /cdn-cgi/l/email-protection";
    } 
}    

Lombok 仍会像往常一样在构建器类中生成其他所需的方法。您可以像这样覆盖 lombok 生成的构建器类中任何方法/字段的行为。(不确定这是否是正确的做法,但它确实有效!)

NOTE :传递一个明确的null构建对象时会将值设置为null

//this would generate password and email with the given default values.
UserRequestTestDataUtils.builder().username("testname").build();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用辅助方法为 Java 对象生成测试数据时提供默认值 的相关文章

随机推荐