如何使用JUNIT测试是否已修改对象



我有一种方法。

void (Item item) {
}

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

一种方法必须具有名称。
因此,我们会认为您的意思是:

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);

对我们来说,更好的方法是item.hashCode()。如果项目在项目中正确覆盖,并且项目中的每个类都将反映每个更改(这是HashCode背后的想法(。

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

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