I'm trying to define my own custom exceptions. Basically i want to prevent a user to be created if the age is less than 16. Following some of the discussions / questions i've come up with this so far.
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;
}
}
Exception class:
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;
}
}
In a Validator package, i have the following:
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);
}
}
}
I'm calling validate method in Services, where i try to create the user:
public User save(User user) {
validator.validate(user);
return userRepository.save(user);
}
So that's what i have so far, i tried to test this without success.
@ 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);
}
Here's what i get:
Expected: (an instance of org.dnet.training.exceptions.TrainingException and exception with message a string containing "The user age is invalid") but: exception with message a string containing "The user age is invalid" message was null.
It's obvious that i'm missing something but i'm stuck, tried different stuff but without any success so far.
You create an exception by throw new TrainingException(Code.USER_INVALID_AGE);
which doesn't set the message. In constructor of TrainingException
call super(code.getMessage());
which will set the message for that instance of the exception.