Не JUnit или Hamcrest имеют допуск утверждения?
Я хочу сделать утверждение, где фактическое значение находится в пределах либо фиксированного + / - значения ожидаемого значения, либо процента + / - значения ожидаемого значения.
Когда я гуглил, я заметил, что у NUnit был хороший синтаксис для этого:
Assert.That( 5.5, Is.EqualTo( 5 ).Within(0.075);
Assert.That( 5.5, Is.EqualTo( 5 ).Within(1.5).Percent;
Есть ли у JUnit или Hamcrest что-то подобное, что я могу использовать? Если нет, то есть ли хороший способ выразить это поведение?
2 ответа:
Короткий ответ - да.
Старомодно
org.junit.Assert
имеет методassertEquals(java.lang.String message, float expected, float actual, float delta)
, а также кучу аналогичных методов для двойников, перегруженных вариантов без сообщения и аналогичных реализацийassertArrayEquals
.Если вы хотите использовать Hamcrest, то
closeTo
мэтчер - это то, что вы ищете.Правка:
Чтобы ответить на вопрос в комментариях о процентах - для этого нет готового сопоставления, но вы можете сами что-то подстроить, разделив два, и убедившись, что они находятся между желаемым соотношением и его обратным. Чтобы взять пример из OP:Это немного (ну, много) неуклюже, но это должно сделать трюк.float expected = 5.0; float actual = 5.5 float ratio = 1.0075; float inverse = 1/ratio; float div = actual/expected; assertThat(div, allOf(greaterThan(inverse), lessThan(ratio)));
дополняя ответ Мурейника:
Чтобы утверждать с относительным допуском / процентом, вы можете просто умножить:
double closeTo5 = 4.6; double relativeTolerance = 0.1; double expected = 5; assertThat(closeTo5, is(closeTo(expected, expected*relativeTolerance)));
Или, если вы хотите получить фантазии, написать свой собственный matcher (что не трудно)...