AssertContains กับสตริงใน jUnit


187

มีวิธีที่ดีกว่าในการเขียนใน jUnit

String x = "foo bar";
Assert.assertTrue(x.contains("foo"));

7
IMO นี้ดีพอตัวเลือกที่แนะนำนั้นสามารถอ่านได้น้อยกว่า
เจ้าพ่อ

3
@TheGodfather อ่านน้อย แต่ผลิตข้อผิดพลาดที่ยืนยันความหมายมากขึ้น (เช่นการตอบสนองที่ได้รับการยอมรับจะแสดงความแตกต่างในสายที่เป็นวิธีแก้ปัญหาตรวจการณ์ก็จะแสดง "เท็จเมื่อคาดว่าทรู" ในความล้มเหลว)
ไมค์

สิ่งที่ทำให้การยืนยัน "ดีกว่า" เป็นข้อผิดพลาดเมื่อมันล้มเหลว วิธีที่สามารถอ่านได้ในโค้ดนั้นเป็นเรื่องรองเนื่องจากคุณไม่ต้องดูโค้ดจนกว่าจะล้มเหลวและข้อความความล้มเหลวเป็นสิ่งแรกที่คุณเห็น
rjmunro

คำตอบ:


291

หากคุณเพิ่มใน Hamcrest และ JUnit4 คุณสามารถทำได้:

String x = "foo bar";
Assert.assertThat(x, CoreMatchers.containsString("foo"));

ด้วยการนำเข้าคงที่บางอย่างมันดูดีขึ้นมาก:

assertThat(x, containsString("foo"));

การนำเข้าคงที่ที่จำเป็นจะเป็น:

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.containsString;

8
ตรวจสอบให้แน่ใจว่าคุณกำลังใช้งานorg.junit.Assertเมื่อเทียบกับjunit.framework.Assertในภายหลังเนื่องจากไม่มี Hamcrest MatcherassertThat()
Visionary Software Solutions

15
ฉันคิดว่าเมื่อใช้ JUnit 4.10 คลาสที่ใช้คือ org.junit.matchers.JUnitMatchers เช่น: assertThat ("อะไรบางอย่าง", JUnitMatchers.containString ("บางคน"));
Ewen Cartwright

1
ข้อความความล้มเหลวสำหรับความล้มเหลวassertThatเป็นวิธีที่มีประโยชน์มากขึ้นแล้วassertTrue
ไมค์ Rylander

3
การนำเข้าคงที่ที่จำเป็นคือimport static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString;- เพียงเพื่อช่วยคนจากปัญหา
eis

4
... และorg.hamcrest.Matchers.containsString;ใน API ล่าสุดในการhamcrest-libraryพึ่งพา
eis

13

ใช้fest assert 2.0เมื่อใดก็ตามที่เป็นไปได้แก้ไข: assertjอาจมี assertions เพิ่มเติม (ทางแยก)

assertThat(x).contains("foo");

ฉันไม่พบวิธีการบรรจุด้วย AssertJ.assert นั่น นี่คือสิ่งที่ฉันพบแทน - org.assertj.core.api.Assertions.assertThat (conversionException) .hasMessageContaining ("some substring");
ราชา

ขออภัยฉันคิดว่าความคิดเห็นข้างต้นไม่เหมาะกับบริบทของคำตอบนี้ ฉันใช้งานในกรณีอื่นซึ่งฉันจำเป็นต้องตรวจสอบสตริงย่อยภายในข้อความข้อยกเว้น
ราชา

8

ใช้ Hamcrest Matcher containsString()

// Hamcrest assertion
assertThat(person.getName(), containsString("myName"));

// Error Message
java.lang.AssertionError:
Expected: a string containing "myName"
     got: "some other name"

คุณสามารถเลือกเพิ่มข้อความแสดงข้อผิดพลาดที่ละเอียดยิ่งขึ้นได้

// Hamcrest assertion with custom error message
assertThat("my error message", person.getName(), containsString("myName"));

// Error Message
java.lang.AssertionError: my error message
Expected: a string containing "myName"
     got: "some other name"

โพสต์คำตอบของฉันไปยังคำถามที่ซ้ำกันที่นี่



3

มันสายเกินไป แต่เพียงอัปเดตที่ฉันได้ทำมาพร้อมกับไวยากรณ์ด้านล่าง

import org.hamcrest.core.StringContains;
import org.junit.Assert;

Assert.assertThat("this contains test", StringContains.containsString("test"));

2

ตัวแปรอื่นคือ

Assert.assertThat(actual, new Matches(expectedRegex));

ยิ่งไปกว่านั้นยังorg.mockito.internal.matchersมีผู้จับคู่ที่น่าสนใจเช่นStartWithคนContainsอื่น ๆ



0

ตัวอย่าง (รุ่น junit - 4.13)

import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;

public class TestStr {

@Test
public void testThatStringIsContained(){
    String testStr = "hi,i am a test string";
    assertThat(testStr).contains("test");
 }

}

-1

ฉันได้ลองคำตอบหลายข้อในหน้านี้แล้วไม่ได้ผล:

  • org.hamcrest.CoreMatchers.containStringไม่ได้รวบรวมไม่สามารถแก้ไขวิธีการ
  • JUnitMatchers.containStringมีการ จำกัด (และอ้างอิงถึงCoreMatchers.containString )
  • org.hamcrest.Matchers.containString : NoSuchMethodError

ดังนั้นแทนที่จะเขียนโค้ดที่อ่านได้ฉันตัดสินใจที่จะใช้วิธีที่ง่ายและใช้การได้ที่กล่าวถึงในคำถามแทน

หวังว่าจะมีทางออกอื่นเกิดขึ้น

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