如何使用JUnit Assert断言大于某个值?

155

我有这些来自测试的数值

previousTokenValues[1] = "1378994409108"
currentTokenValues[1] = "1378994416509"

而我尝试着

    // current timestamp is greater
    assertTrue(Long.parseLong(previousTokenValues[1]) > Long.parseLong(currentTokenValues[1]));

我在调试过程中遇到了java.lang.AssertionErrordetailMessagenull

我该如何在使用JUnit时断言大于的条件呢?


请将完整的代码和完整的错误信息一起发布。也许你的断言语句在数组初始化之前。 - Josh M
8个回答

199

你可以像这样使用assertTrue(boolean)。此外,它还有一个重载方法assertTrue(String, boolean),其中String是失败时的消息;如果你想要打印出某个值不大于另一个值的信息,可以使用该方法。

你也可以添加hamcrest-all作为依赖项来使用匹配器。请参见https://code.google.com/p/hamcrest/wiki/Tutorial

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

assertThat("timestamp",
           Long.parseLong(previousTokenValues[1]),
           greaterThan(Long.parseLong(currentTokenValues[1])));

这将会导致如下错误:

java.lang.AssertionError: timestamp
Expected: a value greater than <456L>
     but: <123L> was less than <456L>

3
这里是“OrderingComparison”链接,其中包含“greaterThan”: http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/number/OrderingComparison.html。 - John B
7
<groupId>org.hamcrest</groupId>, <artifactId>hamcrest-all</artifactId> - gavenkoa
2
请注意,使用JUnit 4.11时,默认会包含Hamcrest,因此无需搜索依赖项。 - Chanoch
3
请注意hamcrest和junit引用的顺序 - Don Kirkby
11
我能翻译您的内容。根据您提供的信息,我有JUnit 4.12版本,其传递依赖于Hamcrest-Core 1.3版本。在org.hamcrest.CoreMatchers类中没有greaterThan方法。如果我将Hamcrest-All 1.3作为附加依赖项添加,它将提供org.hamcrest.Matchers.greaterThan方法。 - Anthony Hayward
显示剩余6条评论

30

在使用JUnit断言时,我总是让消息清晰明了。这样可以节省大量调试时间。采用这种方式可以避免添加附加依赖项hamcrest Matchers。

previousTokenValues[1] = "1378994409108";
currentTokenValues[1] = "1378994416509";

Long prev = Long.parseLong(previousTokenValues[1]);
Long curr = Long.parseLong(currentTokenValues[1]);
assertTrue("Previous (" + prev + ") should be greater than current (" + curr + ")", prev > curr);

不错的解决方案,非常简洁。 - Óscar Andreu

17

你也可以尝试以下简单的解决方案:

previousTokenValues[1] = "1378994409108";
currentTokenValues[1] = "1378994416509";

Long prev = Long.parseLong(previousTokenValues[1]);
Long curr = Long.parseLong(currentTokenValues[1]);

Assert.assertTrue(prev  > curr );   

12

你应该将Hamcrest库添加到你的构建路径中。它包含所需的Matchers.class,其中包含lessThan()方法。

依赖关系如下。

<dependency>
  <groupId>org.hamcrest</groupId>
  <artifactId>hamcrest-library</artifactId>
  <version>1.3</version>
  <scope>test</scope>
</dependency>

5
据我所知,目前在JUnit中,语法如下:
AssertTrue(Long.parseLong(previousTokenValues[1]) > Long.parseLong(currentTokenValues[1]), "your fail message ");

这意味着,在信息之前的是条件。


3

如果不想添加额外的库(如 hamcrest),也可以仅使用 junit 依赖项将逻辑实现为实用程序方法:

public static void assertGreaterThan(int greater, int lesser) {
    assertGreaterThan(greater, lesser, null);
}

public static void assertGreaterThan(int greater, int lesser, String message) {
    if (greater <= lesser) {
        fail((StringUtils.isNotBlank(message) ? message + " ==> " : "") +
                "Expected: a value greater than <" + lesser + ">\n" +
                "But <" + greater + "> was " + (greater == lesser ? "equal to" : "less than") + " <" + lesser + ">");
    }
}

2
assertTrue("your message", previousTokenValues[1].compareTo(currentTokenValues[1]) > 0)

这是先前 > 当前值的传递。

0

你可以这样写

  assertTrue("your fail message ",Long.parseLong(previousTokenValues[1]) > Long.parseLong(currentTokenValues[1]));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接