Мне интересно, существует ли чистый и полный способ подтверждения сообщения, прикрепленного к сгенерированному исключению, когда это сообщение было сгенерировано с использованием 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)
, и затем проверка того, что сообщение содержит первую часть, но это действительно ограничивает ваши возможности форматирования сообщений и выглядит не очень чистым.