【问题标题】:Inconsistent behavior with @EqualsAndHashCode between Eclipse JUnit4 and gradle test runEclipse JUnit4 和 gradle 测试运行之间的 @EqualsAndHashCode 行为不一致
【发布时间】:2019-02-15 04:20:53
【问题描述】:

在使用 Eclipse JUnit 和 gradle 测试运行单元测试时,我得到了不同的结果。有这样的课程:

@Getter @Setter
@EqualsAndHashCode
public class ObjectWithId {
    private Long id;
}

以及类似的测试(将案例压缩到一个测试以节省空间):

@Test
public void testObjectWithId() {

    ObjectWithId o1 = new ObjectWithId(), o2 = new ObjectWithId();
    o1.setId(1L);
    o2.setId(1L);
    assertEquals(o1.hashCode(), o2.hashCode());
    assertEquals(o1, o2);

    o2.setId(2L);
    assertNotEquals(o1, o2);
    assertNotEquals(o1.hashCode(), o2.hashCode());

}

一切都按预期进行。

然后,有一个像这样的类:

@Getter @Setter
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class ObjectWithIdAndDate {

    @EqualsAndHashCode.Include
    private Long id;

    private LocalDateTime created;

}

进行如下测试:

@Test
public void testObjectWithIdAndDate() {

    ObjectWithIdAndDate o1 = new ObjectWithIdAndDate(), o2 = new ObjectWithIdAndDate();
    o1.setId(1L);
    o2.setId(1L);
    assertEquals(o1.hashCode(), o2.hashCode());
    assertEquals(o1, o2);

    o2.setId(2L);
    assertNotEquals(o1, o2);
    assertNotEquals(o1.hashCode(), o2.hashCode());

    o2.setId(1L);
    o2.setCreated(LocalDateTime.now());
    // Eclipse JUnit starts failing here because setting the created.
    // Gradle test will pass.
    assertEquals(o1.hashCode(), o2.hashCode());
    assertEquals(o1, o2);

    o1.setCreated(LocalDateTime.now());
    assertEquals(o1.hashCode(), o2.hashCode());
    assertEquals(o1, o2);

}

使用 Eclipse JUnit 运行时失败,但使用 gradle 测试成功?我从 Eclipse 和命令行运行 gradle 测试,没有区别。所以,似乎不知何故 gradle 更清楚应该如何对待 @EqualsAndHashCode(onlyExplicitlyIncluded = true)...?

我的build.gradle 中有compile 'org.projectlombok:lombok:1.18.2',我的Eclipse 中安装了相同版本的lombok.jar。

gradle 项目和 Eclipse 都使用 JUnit 4.12 版。我在这里错过了什么?

一些进一步的调查:

我用 Maven 构建了其他相同的项目。令我惊讶的是,这个项目的 JUnit 测试也通过了。

这听起来像是 Eclipse gradle 项目方面或其他一些 gradle 项目特定设置有问题吗?

【问题讨论】:

  • 你也在用Eclipse的编译器吗?
  • 你的测试也是错误的;第二个setCreated 永远不可能等于相同的LocalDateTime。将其隔离到一个变量中并改用它。
  • @Makoto 我猜是这样,我通过“Run as JUnit test”运行它
  • @Makoto setCreated(..) 是为了测试@EqualsAndHashCode(onlyExplicitlyIncluded = true) 的功能,所以如果我理解正确的话,它永远不应该被考虑比较。测试结果是否正确。
  • 啊——我没注意到。当我看到有人在两个不同的地方使用LocalDateTime.now() 时,这对我来说只是一种瞬间的气味。

标签: java eclipse gradle junit lombok


【解决方案1】:

您还需要更新 Eclipse 安装的 lombok。您可以在 Help > About Eclipse 屏幕中验证安装的版本。在白色区域,底线应告知您已安装的版本。

运行 java -jar lombok.jar 以更新您的安装。

【讨论】:

  • 观察力不错。我没有把它放在我的问题中,但我也是第一次尝试。 Eclipse 说它有 1.18.2。所以我认为这与 lombok.jar 的版本冲突无关。
  • 我只是用 lombok 插件 1.18.2 和当前的 edge 1.18.3 检查了你的例子,两者都在 Eclipse 和 maven 中按预期工作。所以这可能是 Eclipse 中的 lombok 插件安装的问题。您能否尝试将 lombok 安装到全新的 Eclipse 安装并使用干净的工作区?
  • 它也适用于我的机器。如何启动 Eclipse?如果您使用快捷方式,请确保该快捷方式没有使用不同的 lombok 版本。
  • 感谢您的帮助。就像更新一样:我进行了全新安装,问题消失了,所以从头开始使用 Eclipse & Lombok & workspace。从来没有发现是什么问题。实际上,我在两台不同的机器上遇到了这个问题,但我无法检测到这些安装有什么特别之处才能产生这种差异。
猜你喜欢
  • 1970-01-01
  • 2017-12-21
  • 2011-01-20
  • 2017-10-02
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多