我有一种方法。
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()
。