AssertContains trên chuỗi trong jUnit


186

Có cách nào đẹp hơn để viết trong jUnit

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

7
IMO này là đủ tốt, các tùy chọn được đề xuất là ít đọc hơn
Bố già

3
@TheGod lương ít đọc hơn, nhưng tạo ra các lỗi xác nhận có ý nghĩa hơn (nghĩa là phản hồi được chấp nhận sẽ cho thấy sự khác biệt về chuỗi, trong đó giải pháp OP sẽ chỉ hiển thị "Sai khi dự kiến ​​Đúng" khi thất bại)
Mike

Điều làm cho một khẳng định "đẹp hơn" là thông báo lỗi khi nó không thành công. Làm thế nào nó có thể đọc được trong mã là thứ yếu, bởi vì bạn không phải xem mã cho đến khi nó bị lỗi và thông báo lỗi là điều đầu tiên bạn nhìn thấy.
rjmunro

Câu trả lời:


289

Nếu bạn thêm vào Hamcrest và JUnit4, bạn có thể làm:

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

Với một số nhập khẩu tĩnh, có vẻ tốt hơn rất nhiều:

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

Các nhập khẩu tĩnh cần thiết sẽ là:

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

8
Hãy chắc chắn rằng bạn đang sử dụng org.junit.Assertso với junit.framework.Assert, vì cái sau không có Hamcrest MatcherassertThat()
Giải pháp phần mềm có tầm nhìn

15
Tôi nghĩ khi chạy JUnit 4.10, lớp sẽ sử dụng là org.junit.matchers.JUnitMatchers, ví dụ: assertThat ("cái gì đó", JUnitMatchers.containsString ("some"));
Ewen Cartwright

1
Thông báo thất bại cho một thất bại assertThatlà cách hữu ích hơn sau đóassertTrue
Mike Rylander

3
nhập khẩu tĩnh là cần thiết import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString;- chỉ để cứu ai đó khỏi rắc rối
eis

4
... và org.hamcrest.Matchers.containsString;trong api mới nhất, trong sự hamcrest-libraryphụ thuộc.
eis

12

sử dụng festival assert 2.0 bất cứ khi nào có thể EDIT: assertj có thể có nhiều xác nhận hơn (một ngã ba)

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

Tôi không tìm thấy phương thức chứa với AssertJ.assertThat. Đây là những gì tôi tìm thấy thay vào đó - org.assertj.core.api.Assertions.assertThat (convertException) .hasMessageContained ("một số chuỗi con");
Raj

xin lỗi, tôi nghĩ nhận xét trên của tôi không phù hợp với bối cảnh của câu trả lời này. Tôi đã sử dụng một trường hợp sử dụng khác trong đó tôi cần kiểm tra một chuỗi con trong một thông báo ngoại lệ.
Raj

8

Sử dụng Hamcrest Matcher containsString()

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

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

Bạn có thể tùy chọn thêm một thông báo lỗi chi tiết hơn nữa.

// 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"

Đăng câu trả lời của tôi cho một câu hỏi trùng lặp ở đây



3

Quá muộn, nhưng chỉ cần cập nhật, tôi đã hoàn thành cú pháp dưới đây

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

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

2

Một biến thể khác là

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

Hơn nữa trong org.mockito.internal.matchersđó có một số đối sánh thú vị khác, như StartWith, Containsvv


0

biến thể assertj

import org.assertj.core.api.Assertions;
Assertions.assertThat(actualStr).contains(subStr);

0

Ví dụ (phiên bản 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

Tôi đã thử nhiều câu trả lời trên trang này, không có câu trả lời nào thực sự hiệu quả:

  • org.hamcrest.CoreMatchers.containsString không biên dịch, không thể giải quyết phương thức.
  • JUnitMatchers.containsString bị lỗi (và đề cập đến CoreMatchers.containsString ).
  • org.hamcrest.Matchers.containsString : NoSuchMethodError

Vì vậy, thay vì viết mã có thể đọc được, tôi quyết định sử dụng cách tiếp cận đơn giản và khả thi được đề cập trong câu hỏi thay thế.

Hy vọng một giải pháp khác sẽ được đưa ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.