你好。告诉我当被测函数产生不同类型的结果时如何正确处理测试。比如有这样一个测试类:
public class Calculator {
public Double leg(int hyp, int leg){
if (Math.abs(hyp) < Math.abs(leg))
return Double.NaN;
return Math.sqrt(Math.pow(hyp, 2) - Math.pow(leg, 2));
}
}
这是测试类:
import org.junit.*;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.number.IsCloseTo.closeTo;
import static org.junit.Assert.*;
@RunWith(Parameterized.class)
public class CalculatorParametrizedTest {
public Calculator calculator;
private int hyp;
private int leg;
private double expected;
@Parameterized.Parameters(name = "Тест {index}: гипотенуза = {0}, катет = {1}, катет = {2}")
public static Iterable<Object[]> dataForTest() {
return Arrays.asList(new Object[][]{
{5, 4, 3},
{5, -4, 3},
{-5, 4, 3},
{-5, -4, 3},
{4, 5, Double.NaN},
{3, 2, 2.24}
});
}
public CalculatorParametrizedTest(int hyp, int leg, double expected){
this.hyp = hyp;
this.leg = leg;
this.expected = expected;
}
@Before
public void setUp(){
calculator = new Calculator();
}
@After
public void tearDown(){
calculator = null;
}
@Test
public void testLeg(){
assertThat(calculator.leg(hyp, leg), is(closeTo(expected, 0.1)));
}
}
使用 value 测试失败{4, 5, Double.NaN}
。这是错误的描述:
java.lang.AssertionError: Expected: is a numeric value within <0.1> of but:
<NaN>
不同<NaN>
我知道比较 NaN 和 NaN 是没有意义的,但我不明白如何正确编写测试。如何为示例中给出的函数编写测试leg
?
assertEquals(double expected, double actual, double delta)
NaN
在比较中考虑到。从文档:
例子:
Matcher 附录:
Matchers.closeTo
不考虑 NaN 并且我没有在 hamcrest 中找到可以以这种方式进行比较的现成方法。您可以使用以下方式自己编写条件
notANumber
:但它看起来像一辆自行车。
在Github 上的一个类似问题的讨论中,他们建议编写一个这样的匹配器: