Search code examples
javaexceptiontestingjunitjunit-rule

check errorcode with @rule in junit


I found @Rule annotation in jUnit for better handling of exception. Is there a way to check error code ?

Currently my code looks like (without @Rule):

 @Test
    public void checkNullObject() {
    MyClass myClass= null;
    try {
        MyCustomClass.get(null); // it throws custom exception when null is passed
    } catch (CustomException e) { // error code is error.reason.null
        Assert.assertSame("error.reason.null", e.getInformationCode());
    }
    }

But with use of @Rule, I am doing following :

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

        @Test
        public void checkNullObject() throws CustomException {
        exception.expect(CustomException .class);
        exception.expectMessage("Input object is null.");
        MyClass myClass= null;
        MyCustomClass.get(null);

        }

But, I want to do something like below:

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

        @Test
        public void checkNullObject() throws CustomException {
        exception.expect(CustomException .class);
       //currently below line is not legal. But I need to check errorcode.
        exception.errorCode("error.reason.null");
        MyClass myClass= null;
        MyCustomClass.get(null);

        }

Solution

  • You can use a custom matcher on the rule with the expect(Matcher<?> matcher) method.

    For example:

    public class ErrorCodeMatcher extends BaseMatcher<CustomException> {
      private final String expectedCode;
    
      public ErrorCodeMatcher(String expectedCode) {
        this.expectedCode = expectedCode;
      }
    
      @Override
      public boolean matches(Object item) {
        CustomException e = (CustomException)item;
        return expectedCode.equals(e.getInformationCode());
      }
    }
    

    and in the test:

    exception.expect(new ErrorCodeMatcher("error.reason.null"));