1

In my program I'm throwing a custom Exception object MyCustomException, which looks like this:

public class MyCustomException
{
    private MyCustomExceptionObject myCustomExceptionObject;
    // Getters, Setters, Constructors...
}

public class MyCustomExceptionObject
{
    int code;
    // Getters, Setters, Constructors...
}

With Spring Boot Starter Test I've got many testing libraries at my disposal.

  • AssertJ
  • JUnit4
  • Mockito
  • Hamcrest

Currently I'm mainly using AssertJ. One of my tests give invalid parameters to a method and expect an exception.

@Test
public void test()
{
    org.assertj.core.api.Assertions.assertThatThrownBy(() -> someMethod(-1)).isExactlyInstanceOf(MyCustomException.class);
}

public void someMethod(int number)
{
    if (number < 0)
    {
        throw new MyCustomException(new MyCustomExceptionObject(12345));
    }
    //else do something useful
}

This works fine, but I want to test the exceptions more specifically, testing if the code is as expected. Something like this would work:

try
{
    someMethod(-1);
}
catch (MyCustomException e)
{
    if (e.getCode() == 12345)
    {
        return;
    }
}

org.assertj.core.api.Assertions.fail("Exception not thrown");

but I'm rather looking for a one-liner like:

org.assertj.core.api.Assertions.assertThatThrownBy(() -> someMethod(-1)).isExactlyInstanceOf(MyCustomException.class).exceptionIs((e) -> e.getCode() == 12345);

Does something like this exist in any of the above listed testing libraries (AssertJ preferred)?

Impulse The Fox
  • 2,638
  • 2
  • 27
  • 52

1 Answers1

1

I would give a try to catchThrowableOfType which allows you to assert your custom exception data, for exanple:

class CustomParseException extends Exception {
   int line;
   int column;

   public CustomParseException(String msg, int l, int c) {
     super(msg);
     line = l;
     column = c;
   }
 }

 CustomParseException e = catchThrowableOfType(
                            () -> { throw new CustomParseException("boom!", 1, 5); }, 
                            CustomParseException.class);
 // assertions succeed
 assertThat(e).hasMessageContaining("boom");
 assertThat(e.line).isEqualTo(1);
 assertThat(e.column).isEqualTo(5);
Joel Costigliola
  • 6,308
  • 27
  • 35