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"));
ripper234
sumber
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;
Yishai
sumber
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");
piotrek
sumber
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

Mike Rylander
sumber
5

Gunakan assertThatsintaks baru bersama dengan Hamcrest .

Ini tersedia mulai dengan JUnit 4.4 .

Robert Munteanu
sumber
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"));
rns
sumber
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.

LEON DENIS
sumber
0

varian assertj

import org.assertj.core.api.Assertions;
Assertions.assertThat(actualStr).contains(subStr);
Lazarenko Alex
sumber
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");
 }

}
Muriithi Derrick
sumber
-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.

P Kuijpers
sumber