【问题标题】:Tests pass in Eclipse but fails in Gradle. Related to assertThat测试在 Eclipse 中通过,但在 Gradle 中失败。关于 assertThat
【发布时间】:2014-06-15 02:25:22
【问题描述】:

我有一个在 Eclipse 中完美运行但在 Gradle 中失败的测试。我不确定出了什么问题。我在 Eclipse 中使用 Java 8。

提示:

E:\Files\Source\Workspace-Eclipse2\project\src\test\java\com\project\core\domain\TeamUnitTest.java:31: error: no sui
table method found for assertThat(List<User>,Matcher<Collection<Object>>)
                assertThat(team.getUsers(), empty());
                ^
    method Assert.<T#1>assertThat(T#1,Matcher<? super T#1>) is not applicable
      (actual argument Matcher<Collection<Object>> cannot be converted to Matcher<? super List<User>> by method invocati
on conversion)
    method Assert.<T#2>assertThat(String,T#2,Matcher<? super T#2>) is not applicable
      (cannot instantiate from arguments because actual and formal argument lists differ in length)
  where T#1,T#2 are type-variables:
    T#1 extends Object declared in method <T#1>assertThat(T#1,Matcher<? super T#1>)
    T#2 extends Object declared in method <T#2>assertThat(String,T#2,Matcher<? super T#2>)
E:\Files\Source\Workspace-Eclipse2\project\src\test\java\com\project\core\domain\TeamUnitTest.java:51: error: no sui
table method found for assertThat(List<User>,Matcher<Collection<Object>>)
                assertThat(team.getUsers(), empty());
                ^
    method Assert.<T#1>assertThat(T#1,Matcher<? super T#1>) is not applicable
      (actual argument Matcher<Collection<Object>> cannot be converted to Matcher<? super List<User>> by method invocati
on conversion)
    method Assert.<T#2>assertThat(String,T#2,Matcher<? super T#2>) is not applicable
      (cannot instantiate from arguments because actual and formal argument lists differ in length)
  where T#1,T#2 are type-variables:
    T#1 extends Object declared in method <T#1>assertThat(T#1,Matcher<? super T#1>)
    T#2 extends Object declared in method <T#2>assertThat(String,T#2,Matcher<? super T#2>)
2 errors
:compileTestJava FAILED

测试代码:

assertThat(team.getUsers(), empty());

【问题讨论】:

  • Gradle 构建可能是使用不喜欢此代码的早期 Java 版本编译的。查看gradle -v显示的是哪个JVM版本。
  • @PeterNiederwieser 我会试试这个。
  • 向 Hamcrest 1.3 添加显式依赖并使用 JUnit 4.11。

标签: java junit gradle


【解决方案1】:

看起来您的 gradle 构建并没有像 Eclipse 那样引入同一个 junit 或 hamcrest,而是一个较旧的。您应该设置明确的依赖关系。

如果你把这个类放到src/test/java/SOTest.java

import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

import java.util.Collections;
import java.util.List;

public class SOTest {
  @Test
  public void doTest() throws Exception {
     // Regular JUnit assert
     assertEquals(true, true);

     // Hamcrest assertThat
     List<Object> teamUsers = Collections.emptyList();
     assertThat(teamUsers, empty());
  }
}

然后在以下位置创建一个build.gradle 文件:

apply plugin: 'java'
sourceCompatibility = 1.6

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.+'
    testCompile group: 'org.hamcrest', name: 'hamcrest-core', version: '1.3'
    testCompile group: 'org.hamcrest', name: 'hamcrest-library', version: '1.3'
}

并构建,assertThat(Collection,empty()) 的测试将运行并通过。

这里的区别是我们明确依赖新版本的 junit,以及包含这些匹配项的 hamcrest 1.3 版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2012-08-05
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多