Почему мой импорт метода containsString не работает?

Я написал простой Java script ниже, чтобы узнать больше о TDD, IntelliJ и Java.

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.both;

public class JUnit_Dummy {

  private StringJoiner joiner;
  private List<String> strings;

  @Before
  public void setUp() throws Exception {
    strings = new ArrayList<String>();
    joiner = new StringJoiner();
  }
....

  @Test
  public void shouldContainBothStringsWhenListIsTwoStrings() {
    strings.add("one");
    strings.add("two");
    assertThat(joiner.join(strings),
        both(containsString("A")).
            and(containsString("B")));
  }

}
_____________

import java.util.List;

public class StringJoiner {
  public String join(List<String> strings) {
    if(strings.size() > 0) {
      return (strings.get(0);
    }
    return "";
  }
}

Я пытаюсь использовать метод containsString внутри утверждения, но IntelliJ продолжает говорить мне, что он "не может разрешить метод containsString (java.lang.String)". Это несмотря на то, что jUnit docs (http://junit.sourceforge.net/javadoc/org/junit/matchers/JUnitMatchers.html#containsString (java.lang.String)) скажите, что этот метод принимает параметр String.

Я попытался заменить различные операторы импорта, в том числе следующие:

import static org.hamcrest.Matcher.containsString;
import static org.hamcrest.Matcher.*;
import static org.hamcrest.CoreMatchers.*;

Лучшее, что я получаю, это grey-out-import, говорящий мне, что инструкция import не используется. Не уверен, в чем проблема, любая помощь будет оценена.

UPDATE:

Вот точная ошибка компилятора:

java: cannot find symbol
  symbol:   method containsString(java.lang.String)
  location: class JUnit_Dummy

Ответ 1

Мне показалось, что я уже пробовал все стоящие инструкции импорта, но этот трюк сделал:

import static org.junit.matchers.JUnitMatchers.*;

Ответ 2

Мы должны использовать метод containsString библиотеки hamcrest.

Мое предложение состояло в том, чтобы придерживаться Junit 4 и импортировать библиотеку hamcrest 1.3 в ваш путь сборки. Это сделало бы трюк.

Это позволит вам также получить доступ к другим функциям библиотеки hamcrest.

Решение также можно найти, добавив требуемый статический импорт вручную. Или вы можете настроить требуемый статический импорт на вкладке избранных eclipse.

Ответ 3

У меня возникла такая же проблема с приложением Spring Boot. Похоже, что это проблема упорядочения зависимостей. Одна из зависимостей, упомянутых в pom.xml, перед артефактом "spring -boot-starter-test" переопределяла версию hamcrest.

Итак, все, что я сделал, это изменить порядок (переместил эту зависимость вверх):

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

Я использую Spring Boot 1.5.7.RELEASE.

Ответ 4

попробуйте это вместо

импортировать статические org.hamcrest.CoreMatchers. *;