JUnit assertTrue()方法调用,是否缺少对象?

时间:2013-07-03 02:04:01

标签: java junit

我正在学习JUnit,但不应该像这样使用assertTrue(..):

anObject myObject=anObject();
myObject.assertTrue(...);

我不太了解的部分是,在一种OO语言中,突然出现这个没有对象的方法调用,它似乎意味着JUnit.assertTrue(...),这就是我理解它的方式,但这是没有提到,我是否正确?

如果是,则“Result result = JUnitCore.runClasses(TestJunit.class);”应该是这样的:

Result result = runClasses(TestJunit.class);

为什么不一致?我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

首先,assertTrue及其亲属(assertFalseassertThat)都是静态方法。可以导入他们选择断言的静态方法(并且它存在于Assert中,因此assertTrueAssert.assertTrue的简写。)

其次,断言发生在尊重到对象,但作为它的属性。在我看来,如果断言是对象的实际属性,则对具体对象进行断言是没有意义的。

第三,当你检索你的结果时(我认为你正在做的事情),你想要你正在测试的具体对象的答案。我不理解你的构造用于检索Result,因为你打算在单元测试中测试的只是一些代码单元 - 一些小的,直接的验证,以及一些不会主动干扰重构工作的东西


以下是我通常编写单元测试的方法。希望这能为您提供一些关于我的测试内容以及我将要测试的内容的一些说明。

使用案例:我编写了一个实用程序来检索两个Lists之间的集合差异,显而易见的是可能存在重复的警告。这是我记得的另外一些代码,但是我很喜欢它,我对它进行了改进,并编写了测试来确保行为。

public static List<Integer> difference(List<Integer> leftList, List<Integer> rightList) {
    if(null == leftList || null == rightList) {
        throw new IllegalArgumentException("Can't have any null parameters.");
    }
    if(leftList.size() < rightList.size()) {
        throw new IllegalArgumentException("Left shouldn't be larger than right.");
    }

    List<Integer> result = new LinkedList<>();
    int i = 0;
    int j = 0;
    while (i < leftList.size()) {
        while (j < rightList.size()) {
            Integer leftElement = leftList.get(i);
            Integer rightElement = rightList.get(j);
            if(rightElement.compareTo(leftElement) <= 0) {
                // less than or equal to.  Skip.
                i += 1;
                j += 1;
                break;
            }
            if(rightElement.compareTo(leftElement) > 0) {
                // The right-hand side is greater than the left hand side.
                // Add it to the results.
                result.add(leftElement);
                i++;
                break;
            }
            j++;
        }
    }
    return result;
}

这是单元测试的样子。请注意我原则上断言一件事。它违反了OO的一些原则,但是当你编写测试时,你想要断言行为和结果。

@Test
public void testDifference() throws Exception {
    //given
    List<Integer> left = Lists.newArrayList(1, 2, 3, 4, 5);
    List<Integer> right = Lists.newArrayList(1, 2, 4, 5);

    //when
    List<Integer> result = SetUtils.difference(left, right);

    //then
    assertEquals(Lists.newArrayList(3), result);
}

@Test
public void testDifference2() throws Exception {
    //given
    List<Integer> left = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 9, 10);
    List<Integer> right = Lists.newArrayList(1, 2, 4, 5, 10);

    //when
    List<Integer> result = SetUtils.difference(left, right);

    //then
    assertEquals(Lists.newArrayList(3, 6, 7, 9), result);
}

如果你继续这么远,让我说明在这种行为中编写单元测试的好处之一。如果我想放弃使用while循环,而是使用foreach,我现在可以放心地执行重构;单元测试的结构方式使我能够一目了然地看到并期望我真正希望从这段代码中获得的行为。

如果有效性是静态的一部分,我无法想象试图这样做。这将是艰难的拉开。

答案 1 :(得分:1)

在这种情况下,assertTruestatic method,在Assert.java中定义。

您的源代码通常为import static org.junit.Assert.*;,因此可以在测试源中提供Assert类中的所有静态方法。您也可以像在JUnit Getting Started指南中那样静态导入一个方法,例如assertEquals方法。 Java {1.5}引入了Static imports

OO-ish语言提供了一种编写不在对象的特定实例上操作的方法的方法(例如,SmalltalkScala)。