【问题标题】:Why is my import of the containsString method not working?为什么我的 containsString 方法的导入不起作用?
【发布时间】:2014-07-21 23:51:03
【问题描述】:

我编写了下面的简单 Java 脚本,以了解有关 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 文档 (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.*;

我得到的最好的结果是一个灰色的导入语句,告诉我导入语句未使用。不知道是什么问题,如有帮助,将不胜感激。

更新:

这是确切的编译器错误:

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

【问题讨论】:

  • 请提供确切的编译器错误和/或堆栈跟踪,您可以在其中看到这一点。
  • 已添加。但是首先,作为一个 IDE,IntelliJ 能够告诉我它无法解决有问题的方法,而无需我进行编译。
  • JUnitMatchers 还是 CoreMatchers?
  • @SotiriosDelimanolis 好问题。我以为我已经尝试了这两种方法,但我只是尝试了以下方法并且它起作用了:“import static org.junit.matchers.JUnitMatchers.*;”谢谢你的灵感。 :-)
  • @SotiriosDelimanolis,你知道为什么 JUnitMatchers 可以工作而 CoreMatchers 不行吗?

标签: java junit intellij-idea


【解决方案1】:

我以为我已经尝试了所有有价值的 import 语句,但这个成功了:

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

【讨论】:

  • 我认为您应该使用org.hamcrest.Matchers.containsString,因为您的导入已被正式弃用(注意Matchers 中的s)。但我注意到还有org.junit.internal.matchers.StringContains.containsStringorg.hamcrest.core.StringContains.containsString,所以我想知道最规范的导入是什么。也许有人有答案?
  • 虽然此导入确实解决了问题,但问题仍然是“为什么?”
【解决方案2】:

我们应该使用hamcrest库的containsString方法。

我的建议是坚持使用 Junit 4 并在您的构建路径中导入 hamcrest 库 1.3。这样就可以了。

这将允许您访问 hamcrest 库的其他功能。

也可以通过手动添加所需的静态导入来找到解决方案。或者您可以在 eclipse 的收藏夹选项卡中配置所需的静态导入。

【讨论】:

    【解决方案3】:

    我在使用 Spring Boot 应用程序时遇到了同样的问题。 似乎这是一个依赖排序问题。在“spring-boot-starter-test”工件覆盖 hamcrest 版本之前,pom.xml 中提到的依赖项之一。

    所以我所做的只是改变了顺序(向上移动了这个依赖):

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

    我正在使用 Spring Boot 1.5.7.RELEASE。

    【讨论】:

    • 与 Spring Boot 2.2.4.RELEASE 相同
    【解决方案4】:

    试试这个

    导入静态 org.hamcrest.CoreMatchers.*;

    【讨论】:

      【解决方案5】:

      我正在使用 MAVEN - 做一个教程,我遇到了同样的问题。

      我使用了“import static org.hamcrest.CoreMatchers.*;”解决方案,但失败了。

      然后我将 JUNIT 移到 POM 文件列表中的第一个位置 - 这解决了它。

      【讨论】:

        猜你喜欢
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        • 2020-04-16
        • 2016-10-12
        • 2021-01-30
        • 2015-03-14
        • 2014-11-03
        • 1970-01-01
        相关资源
        最近更新 更多