จะยืนยันมากกว่าการใช้ JUnit Assert ได้อย่างไร


118

ฉันมีค่าเหล่านี้มาจากการทดสอบ

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

และฉันพยายาม

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

ฉันจะได้รับjava.lang.AssertionErrorและการแก้ไขข้อบกพร่องคือdetailMessagenull

ฉันจะยืนยันมากกว่าเงื่อนไขในการใช้งานได้อย่างไร JUnit


โพสต์รหัสทั้งหมดพร้อมกับข้อความแสดงข้อผิดพลาดทั้งหมด บางทีคำสั่งยืนยันของคุณอยู่ก่อนการเริ่มต้นอาร์เรย์
Josh M

คำตอบ:


153

คุณทำได้แค่ไหน 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
FYI นี่คือลิงค์OrderingComparisonที่มีgreaterThan: hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/number/…
John B

7
<groupId>org.hamcrest</groupId>,<artifactId>hamcrest-all</artifactId>
gavenkoa

2
โปรดทราบว่า Hamcrest ถูกรวมไว้โดยค่าเริ่มต้นเมื่อคุณใช้ JUnit 4.11 ดังนั้นไม่จำเป็นต้องค้นหาการอ้างอิง
Chanoch


9
@ Chanoch ฉันมี junit 4.12 ซึ่งสกรรมกริยาขึ้นอยู่กับ hamcrest-core 1.3 ไม่มีเมธอด greaterThan ในคลาส org.hamcrest.CoreMatchers ถ้าฉันเพิ่ม hamcrest-all 1.3 เป็นการอ้างอิงเพิ่มเติมจะมีเมธอด org.hamcrest.Matchers.greaterThan
Anthony Hayward

18

เมื่อใช้ JUnit asserts ฉันมักจะทำให้ข้อความดีและชัดเจน ช่วยประหยัดเวลาในการดีบักได้มาก การทำเช่นนี้เพื่อหลีกเลี่ยงการเพิ่มการพึ่งพาเพิ่มเติมกับ 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

13

คุณยังสามารถลอง Soln ง่ายๆด้านล่าง:

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

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

Assert.assertTrue(prev  > curr );   

9

คุณควรเพิ่ม Hamcrest-library ใน Build Path ของคุณ มันมี Matchers.class ที่จำเป็นซึ่งมีเมธอด lessThan ()

การพึ่งพาดังต่อไปนี้

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


1

อีกทางเลือกหนึ่งหาก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 + ">");
    }
}

1

ดังที่ฉันทราบในขณะนี้ใน JUnit ไวยากรณ์เป็นดังนี้:

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

หมายความว่าเงื่อนไขอยู่ข้างหน้าข้อความ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.