可以从未使用@Test注释的方法调用JUnit断言吗?

时间:2013-10-14 01:26:11

标签: java unit-testing junit

如果我有以下课程:

public class MyTest
{
   @Test
   public void testSomething()
   {
     Something myData = new Something();
     testAccordingToData(myData);
   }


   @Test
   public void testSomethingElse()
   {
     Something myOtherData = new Something("something else");
     testAccordingToData(myOtherData);
   }

   private void testAccordingToData(Something someData)
   {
     assertTrue(somedata.someField);
     assertEquals(someData.someField, someData.someOtherField);
     //and various other assertions based on someData
   }
}

testAccordingToData()中的断言是否正常工作,或只能从使用@Test注释的方法调用断言?

3 个答案:

答案 0 :(得分:3)

junit“断言”只是简单的方法调用。他们可以从任何地方打电话。

答案 1 :(得分:3)

这是Assert中最复杂的链。您可以看到它与注释无关,它会抛出一个AssertionError,这并不奇怪,因为这是断言失败时的作用。

static public void assertEquals(String message, Object expected,
                                Object actual) {
    if (equalsRegardingNull(expected, actual)) {
        return;
    } else if (expected instanceof String && actual instanceof String) {
        String cleanMessage = message == null ? "" : message;
        throw new ComparisonFailure(cleanMessage, (String) expected,
                (String) actual);
    } else {
        failNotEquals(message, expected, actual);
    }
}

检查

private static boolean equalsRegardingNull(Object expected, Object actual) {
    if (expected == null) {
        return actual == null;
    }

    return isEquals(expected, actual);
}

呼叫失败

static private void failNotEquals(String message, Object expected,
                                  Object actual) {
    fail(format(message, expected, actual));
}

调用

static public void fail(String message) {
    if (message == null) {
        throw new AssertionError();
    }
    throw new AssertionError(message);
}

答案 2 :(得分:1)

创建自定义断言方法并不常见,但通常很明智。通常将方法命名为assertFoo

现在,人们可以创建一个自定义的Hamcrest匹配器。

最后,您在上面评论过想要查看所有失败断言的结果。在这种情况下,JUnit 4.8及更高版本为您提供了解决方案。查看ErrorCollector @Rule