gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:46:47 25 4
gpt4 key购买 nike

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

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

我不太明白的是,在OO语言中,突然出现这个没有对象的方法调用,似乎暗示着JUnit.assertTrue(...),这就是我的理解,但这是没有提到,我对吗?

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

Result result = runClasses(TestJunit.class);

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

最佳答案

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

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

第三,当您检索结果时(我认为这就是您正在做的事情),您希望从您正在测试的具体对象中得到答案。我不明白您用于检索 Result 的构造,因为您打算在单元测试中测试的只是一些代码单元 - 一些小的、易于验证的东西,并且不会主动干扰通过重构努力。

<小时/>

这是我通常编写单元测试的方式。希望这能让您清楚地了解我想要从测试中得到什么以及我要测试什么。

用例:我编写了一个实用程序来检索两个列表之间的设置差异,但明显需要注意的是可能存在重复项。这是我记得为另一个答案而组合在一起的一些代码,但我非常喜欢它,因此我对其进行了改进,并编写了测试来确保行为。

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,我现在可以放心地执行重构;单元测试的构造方式使我能够一目了然地看到并期望从这段代码中得到我真正想要的行为。

老实说,如果有效性是静态的一部分,我无法想象要尝试这样做。这很难实现。

关于java - JUnit的assertTrue()方法调用,是否缺少对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17438587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com