Assert Berisi tentang string di jUnit


187

Apakah ada cara yang lebih baik untuk menulis di jUnit

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

7
IMO ini cukup bagus, opsi yang disarankan kurang mudah dibaca
The Godfather

3
@TheGodfather kurang mudah dibaca, tetapi menghasilkan kesalahan pernyataan yang lebih bermakna (yaitu, respons yang diterima akan menunjukkan perbedaan dalam string, sedangkan solusi OPs hanya akan menampilkan "Salah ketika diharapkan Benar" pada kegagalan)
Mike

Apa yang membuat pernyataan "lebih baik" adalah pesan kesalahan ketika gagal. Seberapa mudah dibaca dalam kode adalah sekunder karena itu, karena Anda tidak harus melihat kode sampai gagal, dan pesan kegagalan adalah hal pertama yang Anda lihat.
rjmunro

Jawaban:


291

Jika Anda menambahkan Hamcrest dan JUnit4, Anda bisa melakukan:

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

Dengan beberapa impor statis, tampilannya jauh lebih baik:

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

Impor statis yang dibutuhkan adalah:

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

8
Pastikan Anda menggunakan org.junit.Assertversus junit.framework.Assert, karena Hamcrest MatcherassertThat()
Visionary Software Solutions

15
Saya pikir ketika menjalankan JUnit 4.10, kelas yang akan digunakan adalah org.junit.matchers.JUnitMatchers, misalnya: assertThat ("sesuatu", JUnitMatchers.containsString ("some"));
Ewen Cartwright

1
Pesan kegagalan untuk yang gagal assertThatjauh lebih bermanfaat daripadaassertTrue
Mike Rylander

3
impor statis yang diperlukan adalah import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString;- hanya untuk menyelamatkan seseorang dari masalah
eis

4
... dan org.hamcrest.Matchers.containsString;dalam api terbaru, dalam hamcrest-libraryketergantungan.
eis

13

gunakan fest assert 2.0 bila memungkinkan EDIT: assertj mungkin memiliki lebih banyak pernyataan (garpu)

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

Saya tidak menemukan metode berisi dengan AssertJ.assertThat. Ini yang saya temukan sebagai gantinya - org.assertj.core.api.Assertions.assertThat (conversionException) .hasMessageContaining ("some substring");
Raj

maaf, saya pikir komentar saya di atas tidak sesuai dengan konteks jawaban ini. Saya menggunakan kasus penggunaan yang berbeda di mana saya perlu memeriksa substring dalam pesan pengecualian.
Raj

8

Gunakan hamcrest Matcher containsString()

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

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

Anda dapat menambahkan pesan kesalahan yang lebih detail.

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

Diposting jawaban saya untuk pertanyaan rangkap di sini



3

Sudah terlambat, tetapi hanya untuk memperbarui saya menyelesaikannya dengan sintaks di bawah ini

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

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

2

Varian lain adalah

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

Apalagi di org.mockito.internal.matcherssana ada beberapa korek api yang menarik, seperti StartWith, Containsdll.


0

varian assertj

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

0

Contoh (versi 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

Saya sudah mencoba banyak jawaban di halaman ini, tidak ada yang benar-benar berhasil:

  • org.hamcrest.CoreMatchers.containsString tidak dapat dikompilasi, tidak dapat menyelesaikan metode.
  • JUnitMatchers.containsString dihilangkan (dan merujuk ke CoreMatchers.containsString ).
  • org.hamcrest.Matchers.containsString : NoSuchMethodError

Jadi alih-alih menulis kode yang dapat dibaca, saya memutuskan untuk menggunakan pendekatan sederhana dan bisa diterapkan yang disebutkan dalam pertanyaan.

Semoga solusi lain akan muncul.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.