如何使用Junit测试对象是否已被修改?

时间:2017-04-27 19:06:30

标签: java junit java-8

我有一个方法。

void (Item item) {
}

我想在Junit中测试项目是否已被修改。有人可以告诉我该怎么做?

2 个答案:

答案 0 :(得分:3)

方法必须有一个名字 所以我们假设你的意思是:

void do (Item item) {
}

在测试方法中,您可以在执行方法之前通过执行项目的深层副本来存储项目的状态 然后执行该方法 最后,在返回方法后,您可以检查副本和实际对象在其要比较的字段中是否具有相同的值。

例如,通过在Item中添加复制构造函数来对其进行深层复制,您可以编写:

@Test
public void doWhenItemIsModified (Item item) {
   Item copyItem = item.deepCopy(item);
   instanceUnderTest.do(item);
   Assert.assertNotEquals(copyItem.getMyField(), item.getMyField())
   ... // assert other fields...
}

编辑评论:
您可以在Item类中实现deepcopy,以便在Item的API中公开此构造函数。
如果不是这种情况,您可以在实用程序测试类中添加deepcopy方法 你可以这样写:Item copyItem = UtilTest.deepCopyItem(item);

答案 1 :(得分:1)

对我们item.hashCode()来说,更好的方法是。 如果hashCode在Item中正确覆盖,并且Item中的每个类都将反映出每次更改(这就是hashCode的思想)。

    int old = item.hashCode();
    to.accept(item); //possible change here
    assertThat(item.hashCode(), is(old));

您不应手动覆盖hashCode。您可以使用IDE并使其生成hashCode和equals,也可以使用Lombok-两种方式都可以选择要考虑的字段。 在Java 14中,您可以使用记录(DTO类),考虑到所有字段,它们将实现hashCode()equals()