自定义例外

Ale*_*x L 3 java custom-exceptions

我正在尝试定义自己的自定义异常.基本上我想防止用户在年龄小于16时被创建.接下来我已经提出了一些讨论/问题.

public enum Code {

    USER_INVALID_AGE("The user age is invalid");

    private String message;

    Code(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

}
Run Code Online (Sandbox Code Playgroud)

例外类:

public class TrainingException extends RuntimeException {

private Code code;

    public TrainingException(Code code) {
        this.code = code;
    }

    public Code getCode() {
        return code;
    }

    public void setCode(Code code) {
        this.code = code;
    }
}
Run Code Online (Sandbox Code Playgroud)

在Validator包中,我有以下内容:

public class UserValidator implements Validator<User> {

    /** {@inheritDoc} */
    @Override
    public void validate(User type) {
        if (DateUtils.getYearDifference(type.getUserDetails().getBirthDate(), new DateTime())< 16) {
            throw new TrainingException(Code.USER_INVALID_AGE);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在服务中调用validate方法,我尝试创建用户:

public User save(User user) {
        validator.validate(user);
        return userRepository.save(user);
    }
Run Code Online (Sandbox Code Playgroud)

所以这就是我到目前为止,我试图测试这个没有成功.

@ Rule
    public ExpectedException thrown = ExpectedException.none();

    @Test
    public void testInvalidAge() throws TrainingException{

        thrown.expect(TrainingException.class);
        thrown.expectMessage(Code.USER_INVALID_AGE.getMessage());

        User user = userService.findAll().get(0);
        UserDetails userDetails = new UserDetails();
        userDetails.setBirthDate(UserTestUtils.buildDate(2000, 7, 21, 1, 1, 1));
        user.setUserDetails(userDetails);

        userService.save(user);
    }
Run Code Online (Sandbox Code Playgroud)

这是我得到的:

预期:( org.dnet.training.exceptions.TrainingException的实例和带有消息的异常,其中包含"用户年龄无效"的字符串)但是:消息包含"用户年龄无效"消息的消息为空.

很明显,我错过了一些东西,但是我被困住了,尝试了不同的东西,但到目前为止没有任何成功.

Alm*_*asB 6

您创建了一个throw new TrainingException(Code.USER_INVALID_AGE);不设置消息的异常.在TrainingException调用的构造函数中super(code.getMessage());,它将为该异常实例设置消息.