2016-10-12 3 views
5

containsの反対は何ですか?ハムクレストに入っているのと反対のもの

List<String> list = Arrays.asList("b", "a", "c"); 
    // should fail, because "d" is not in the list 

    expectedInList = new String[]{"a","b", "c", "d"}; 
    Assert.assertThat(list, Matchers.contains(expectedInList)); 


    // should fail, because a IS in the list 
    shouldNotBeInList = Arrays.asList("a","e", "f", "d"); 
    Assert.assertThat(list, _does_not_contains_any_of_(shouldNotBeInList))); 

​​は?

+0

は、あなただけの 'contains'方法を否定することはできますか?すなわち '!contains(shouldNotBeInList)'私はこれをあまりやっていないので、うまくいくかどうかは分かりませんが、試してみる価値はあります。 –

+0

@Michael Pickett:not(すべての要素を含む)=すべての要素が含まれていない – pihentagy

+0

Hamcrestを使用していますか?もしそうなら、構文はもっとanyOf(...)のようにすべきです。私はハムクレストを使ったことがないので、APIを見ていると思います。 –

答えて

4

import static org.hamcrest.Matchers.everyItem; 
import static org.hamcrest.Matchers.isIn; 
import static org.hamcrest.Matchers.not; 

@Test 
public void hamcrestTest() throws Exception { 
    List<String> list = Arrays.asList("b", "a", "c"); 
    List<String> shouldNotBeInList = Arrays.asList("a", "e", "f", "d"); 
    Assert.assertThat(list, everyItem(not(isIn(shouldNotBeInList)))); 
} 

は、このテストを実行しますあなたに与えるでしょう:

期待

:すべてのアイテムのいずれかではない{ "E"、 "A"、 "F"、 "D"}
しかし:項目は ""

+0

答えをありがとう。今私は、整合性の厳密さに関する関連する質問があります:http://stackoverflow.com/questions/40015862/strict-matching-in-hamcrest – pihentagy

0

JavaDocから、私はそれを行うための厄介な方法を見ることができます。おそらくもっと良い方法があります!回避策として

0

:リストは

List<Matcher> individual_matchers = new ArrayList<Matcher>(); 
for(String s : shouldNotBeInList) { 
    individual_matchers.add(Matchers.not(Matchers.contains(s)); // might need to use Matchers.contains({s}) - not sure 
} 
Matcher none_we_do_not_want = Matchers.allOf(individual_matchers); 
Assert.assertThat(list, none_we_do_not_want); 

を(/それが役に立てば幸いテストしていませんが、おそらくバギー)aが含まれていない、とbを含まず、そして...かどうか。このテスト

Set<String> strings = new HashSet<>(list); 
    strings.removeAll(shouldNotBeInList); 

    Set<String> asSet = new HashSet<>(list); 
    Assert.assertTrue(strings.equals(asSet)); 

を(設定に変換する必要があります)shouldNotBeInListは、リスト自体に等しくなければならない。しかしワットより良いがあるはず -

リスト:、1は次のように使用することができますいいえ、私は願っています。このテストケースでは

public <T> Matcher<Iterable<? super T>> doesNotContainAnyOf(T... elements) 
{ 
    Matcher<Iterable<? super T>> matcher = null; 
    for(T e : elements) 
    { 
     matcher = matcher == null ? 
      Matchers.not(Matchers.hasItem(e)) : 
      Matchers.allOf(matcher, Matchers.not(Matchers.hasItem(e))); 
    } 
    return matcher; 
} 

1

、この方法を試してみてくださいあなたは、次のように3つの組み込みのmatcherを組み合わせることができ

List<String> list = Arrays.asList("a", "b", "c"); 
// True 
MatcherAssert.assertThat(list, doesNotContainAnyOf("z","e", "f", "d")); 
// False 
MatcherAssert.assertThat(list, doesNotContainAnyOf("a","e", "f", "d")); 
0

た私はそれを持っていました問題。私の解決策は、このマッチのためにちょうど反転したロジックでした

あなたは、コードのスニペットを見ることができます次のとおりです。

this.mockMvc.perform(get("/posts?page=0&size=1") 
       .with(httpBasic(magelan.getUserName(), magelan.getPassword())) 
       .accept(MediaType.parseMediaType("text/html;charset=UTF-8"))) 
       .andExpect(status().isOk()) 
       .andExpect(content().contentType("text/html;charset=UTF-8")) 
       .andExpect(content().string(allOf(
         containsString("First post") 
       ))) 
       .andExpect(content().string(allOf(
         not(containsString("Second post")) 
       ))); 
関連する問題