Не 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 5

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 (что не трудно)...