我正在尝试定义自己的自定义异常。基本上我想防止用户在年龄小于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;
}
}
异常类:
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;
}
}
在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);
}
}
}
我正在服务中调用validate方法,我尝试创建用户:
public User save(User user) {
validator.validate(user);
return userRepository.save(user);
}
所以这就是我到目前为止,我试图测试这个没有成功。
@ 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);
}
这是我得到的:
很明显,我错过了一些东西,但是我被卡住了,尝试了不同的东西,但到目前为止没有任何成功。预期:(一个例子 org.dnet.training.exceptions.TrainingException和异常 消息包含“用户年龄无效”的字符串) 但是:消息包含“用户年龄无效”消息的消息为空。
答案 0 :(得分:6)
您可以通过throw new TrainingException(Code.USER_INVALID_AGE);
创建一个不会设置消息的例外。在TrainingException
调用super(code.getMessage());
的构造函数中,它将为该异常实例设置消息。
答案 1 :(得分:1)
尝试重写您的自定义异常,如下所示,希望有所帮助:)
public class TrainingException extends RuntimeException {
private Code code;
public TrainingException(Code code) {
super(code.getgetMessage());
this.code = code;
}
public Code getCode() {
return code;
}
public void setCode(Code code) {
this.code = code;
}
}
答案 2 :(得分:1)
在TrainingException构造函数中首先调用super(code.name())然后调用this.code = code。
public TrainingException(Code code) {super(code.name()) this.code = code;}
它会起作用。