我有一个方法。
void (Item item) {
}
我想在Junit中测试项目是否已被修改。有人可以告诉我该怎么做?
答案 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()
。