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

时间:2016-01-08 08:21:50

标签: java unit-testing junit parameterized

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

assertEquals(float expected, float actual, float delta)

其中delta是范围。 但因为我使用参数化测试,我必须使用对象

assertEquals(Object expected, Object actual)

这些对象是包含Floats的列表,但在Code中它们只是对象,因此像这样的解决方案不起作用:

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

assertTrue(Math.abs(Object expected - Object actual)<ERROR_MARGIN)(运营商' - '未定义对象)

3 个答案:

答案 0 :(得分:0)

您可以编写自己的方法进行比较,并返回true或false

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

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

答案 1 :(得分:0)

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

public class OwnAssert extends Assert {

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

}

答案 2 :(得分:0)

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约定一致,尽可能提供最完整的错误消息。