jUnitの文字列に対するAssertContains


186

jUnitで書くより良い方法はありますか

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

7
IMOはこれで十分です。提案されたオプションは読みにくくなります
The Godfather

3
@TheGodfatherは読みにくくなりますが、より意味のあるアサーションエラーが生成されます(つまり、受け入れられた応答は文字列の違いを示しますが、OPsソリューションは失敗時に「False when expected true」と表示されます)
Mike

アサートを「ナイス」にするのは、失敗した場合のエラーメッセージです。失敗するまでコードを確認する必要がなく、失敗メッセージが最初に表示されるため、コード内でコードがどれほど読みやすいかは、その二次的なものです。
rjmunro

回答:


289

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のMatcherを持っていないとして、assertThat()
ビジョナリーソフトウェアソリューション

15
JUnit 4.10を実行しているときに使用するクラスはorg.junit.matchers.JUnitMatchersであると思います。例:assertThat( "something"、JUnitMatchers.containsString( "some"));
Ewen Cartwright

1
失敗した場合の失敗メッセージは、メッセージassertThatよりもはるかに役立ちますassertTrue
マイク・ライランダー

3
必要な静的インポートはimport static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.containsString;-誰かをトラブルから救うためだけです
eis

4
...そしてorg.hamcrest.Matchers.containsString;最新のAPIでは、hamcrest-library依存関係にあります。
2013年

12

可能な場合は常にfest assert 2.0を使用してくださいEDIT:assertjはより多くのアサーションを持っているかもしれません(フォーク)

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

AssertJ.assertThatのcontainsメソッドが見つかりませんでした。これは私が代わりに見つけたものです-org.assertj.core.api.Assertions.assertThat(conversionException).hasMessageContaining( "some substring");
ラジ

申し訳ありませんが、私の上記のコメントは、この回答のコンテキストには適していないと思います。例外メッセージ内の部分文字列を確認する必要がある別のユースケースでした。
Raj

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他の興味深いマッチャーもあります。StartWithContains



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.containsStringはコンパイルされず、メソッドを解決できません。
  • JUnitMatchers.containsStringは廃止されました(そしてCoreMatchers.containsStringを参照します)。
  • org.hamcrest.Matchers.containsString:NoSuchMethodError

だから、私は可読コードを書く代わりに、質問で述べたシンプルで実行可能なアプローチを使うことにしました。

うまくいけば、別の解決策が出てくるでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.