AssertJ: тестирование исключений с помощью сообщений, созданных с помощью String.format - PullRequest
0 голосов
/ 15 октября 2018

Мне интересно, существует ли чистый и полный способ подтверждения сообщения, прикрепленного к сгенерированному исключению, когда это сообщение было сгенерировано с использованием String.format ().Например, класс вроде:

public class Car {

  public static final String DRIVE_ERROR = "Can't drive while car %s is parked!";

  private String name;
  private boolean parked;

  public Car(String name) {
    this.name = name;
    this.parked = true;
  }

  public void drive() {
    if (parked) {
      throw new IllegalStateException(String.format(DRIVE_ERROR, name));
    }
  }
}

(извините за странный пример, просто пытаюсь сделать его как можно более простым) Теперь, если бы я тестировал автомобиль, у меня был бы такой класс:

public class CarTest {

  @Test
  public void drive_test() {
    Car car = new Car("Greased Lightning");
    assertThatThrownBy(() -> car.drive())
        .isInstanceOf(IllegalStateException.class)
        .hasMessageContaining("???");
  }
}

Вопрос в том, как лучше всего утверждать в сообщении?В этом примере я мог бы отделить объявление имени автомобиля, а затем сам использовать формат String, чтобы получить статическую строку из Car и отформатировать имя, но это кажется большим количеством дополнительного кода, и не может бытьлегко используется во многих случаях (например, когда элемент, который входит в форматированную строку, определяется во время выполнения).То, что я действительно хотел бы сделать, это передать строку сообщения об ошибке в hasMessageContaining, чтобы она игнорировала заполнитель "% s" и принимала что-либо в этом месте.Есть ли способ сделать сопоставление регулярных выражений строк с assertJ?Или какой-то другой способ сделать это чисто?

РЕДАКТИРОВАТЬ: Я также открыт для альтернативы при создании исключений, которые имеют сообщения, которые легче проверить.Одним из решений является просто использование конкатенации строк, например throw new Exception(STATIC_ERROR_MESSAGE + name), и затем проверка того, что сообщение содержит первую часть, но это действительно ограничивает ваши возможности форматирования сообщений и выглядит не очень чистым.

1 Ответ

0 голосов
/ 20 октября 2018

Утверждения сообщений об исключениях ограничены по сравнению с обычными утверждениями String.Вы можете использовать matches или containsPattern утверждений, например:

@Test
public void test() {
  // GIVEN some preconditions

  // WHEN
  Throwable thrown = catchThrowableOfType(() -> { throw new IllegalStateException("boom!"); }, 
                                         IllegalStateException.class);
  // THEN
  assertThat(thrown.getMessage()).matches(".oo.")
                                 .containsPattern("oo.");
  // or even better thanks to Rolland Illig suggestion
  assertThat(thrown).hasMessageMatching(".oo.");

}

Обратите внимание, что при использовании catchThrowableOfType у вас нетчтобы проверить, что перехваченное исключение больше относится к ожидаемому типу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...