我如何检查变量是否在参数化 JUnit 测试中的数字范围内

How can i check if a variable is inside a range of numbers in a parameterized JUnit Test

我正在为名为 "Information Retrieval" 的课程创建一个关于语言模型的工作表。学生们应该能够检查他们的代码是否产生了正确的答案,所以我设置了几个 Junit 测试来检查许多情况。因为我想包含多个测试用例,所以我决定使用参数化的 Junit 测试。 (我按照这个例子:http://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/) 我想测试一个函数,其中 returns 一个浮点数可以是 一个数字范围内。如果我要测试两个浮点数,我将能够使用

assertEquals(float expected, float actual, float delta)

其中增量是范围。 但是因为我使用的是参数化测试,所以我必须使用 Objects

assertEquals(Object expected, Object actual)

这些对象是包含浮点数的列表,但在代码中它们只是对象,所以像这样的解决方案不起作用:

assertEquals(Object expected, Object actual, float delta)(此方法不存在)

assertTrue(Math.abs(Object expected - Object actual)<ERROR_MARGIN)(对象的运算符“-”未定义)

您可以编写自己的方法来进行比较,并让 return 为真或为假

assertTrue(objectsAreInRange(actual, expected, delta));

boolean objectsAreInRange(Object actual, Object expected, float delta){
...
}

用户已经给出了答案,但如果您需要特殊的断言,只需扩展断言并编写您自己的实现即可:

public class OwnAssert extends Assert {

    public static void assertEqualsList(Object listOfFloatExpected, Object listOFFloatActual, float delta){
        ...
    }

}
public static assertInRange(String message, float expected, float delta, float actual) {
   if (delta < 0) {
     delta = -delta;
   }
   if (actual < expected - delta)
     Assert.fail(message + actual + " is less than " + expected + " - " + delta);
   if (actual > expected + delta) 
     Assert.fail(message + actual + " is more than " + expected + " + " + delta);
}

public static assertInRange(float expected, float delta, float actual) {
  assertInRange(expected, delta, actual);
}

保持参数顺序与 Junit 约定一致,尽可能提供最完整的错误消息。