Получить объект исключения в модульном тесте с помощью Spring Boot Starter Test

В моей программе я выбрасываю пользовательский объект Exception MyCustomException, который выглядит так:

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

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

Благодаря Spring Boot Starter Test у меня есть много библиотек для тестирования.

  • AssertJ
  • Юнит4
  • Мокито
  • Хэмкрест

В настоящее время я в основном использую AssertJ. Один из моих тестов дает методу недопустимые параметры и ожидает исключение.

@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
}

Это отлично работает, но я хочу более конкретно протестировать исключения, проверяя, соответствует ли code ожидаемому. Что-то вроде этого будет работать:

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

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

но я скорее ищу однострочник, например:

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

Существует ли что-то подобное в какой-либо из перечисленных выше библиотек тестирования (предпочтительно AssertJ)?


person Impulse The Fox    schedule 20.04.2018    source источник
comment
Может быть, этот ответ может помочь? stackoverflow.com/a/43180059/3694269   -  person Shanu Gupta    schedule 20.04.2018


Ответы (1)


Я бы попробовал catchThrowableOfType, который позволяет вам утверждать свои пользовательские данные исключения, например:

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);
person Joel Costigliola    schedule 20.04.2018