[英]Mockito `when` on real object
当对象包含特定值时,我想模拟 Dao 类。 例如,我想在userlist.getStatus == UserlistStatus.DONE
时模拟对数据库的调用
如果附上代码片段。
我的应用程序代码如下:
UserlistBo userlistBo = userlistDao.getByIdAndPublisherId(userlistId, publisher.getId());
if (userlistBo.getStatus() == UserlistStatus.SOURCE_IN_PROGRESS && userlistStatusDto.getStatus().equalsIgnoreCase(UserlistStatus.DONE.getValue())) {
userlistBo.setStatus(UserlistStatus.DONE); // 1
userlistBo = userlistDao.save(userlistBo); // 3
}
标记 1 处的 userlistBo 对象如下:
result = {UserlistBo@1610} "UserlistBo{id=1, name='ul-test-99-9999', status=DONE, source=SEGMENT, ruleId=1, publisherId=1, filename=filename.csv, createdById=null, lastModifiedById=null, creationTimestamp=null, lastModifiedTimestamp=null}"
我的测试代码如下:
expectedUserlistBo.setId(1);
expectedUserlistBo.setName("ul-test-99-9999");
expectedUserlistBo.setPublisherId(1);
expectedUserlistBo.setRuleId(1);
expectedUserlistBo.setFilename("filename.csv");
expectedUserlistBo.setSource(UserlistSource.SEGMENT);
expectedUserlistBo.setStatus(UserlistStatus.SOURCE_IN_PROGRESS);
when(userlistDao.getByIdAndPublisherId(1, publisherBo.getId())).thenReturn(expectedUserlistBo);
UserlistBo expectedUserlistStatusDoneBo = new UserlistBo();
CopyHelperBean.copy(expectedUserlistStatusDoneBo, expectedUserlistBo);
expectedUserlistStatusDoneBo.setStatus(UserlistStatus.DONE); // 2
when(userlistDao.save(expectedUserlistStatusDoneBo)).thenReturn(expectedUserlistStatusDoneBo); // 4
标记 2 处的 userlistBo 是:
result = {UserlistBo@1514} "UserlistBo{id=1, name='ul-test-99-9999', status=DONE, source=SEGMENT, ruleId=1, publisherId=1, filename=filename.csv, createdById=null, lastModifiedById=null, creationTimestamp=null, lastModifiedTimestamp=null}"
由于这两个是具有相同值的不同对象,因此在标记 3 处执行 test 时, userlistBo 返回为null
。
我应该如何模拟标记 4,所以当在标记 3 处调用 Dao 时,它会返回我expectedUserlistStatusDoneBo
而不是null
?
应用程序代码中的对象是
result = {UserlistBo@1610} "UserlistBo{id=1, name='ul-test-99-9999', status=DONE, source=SEGMENT, ruleId=1, publisherId=1, filename=filename.csv, createdById=null, lastModifiedById=null, creationTimestamp=null, lastModifiedTimestamp=null}"
在测试代码中创建的虚拟对象是
result = {UserlistBo@1514} "UserlistBo{id=1, name='ul-test-99-9999', status=DONE, source=SEGMENT, ruleId=1, publisherId=1, filename=filename.csv, createdById=null, lastModifiedById=null, creationTimestamp=null, lastModifiedTimestamp=null}"
虽然值相同,但这两个是不同的对象
when(userlistDao.getByIdAndPublisherId(1, publisherBo.getId())).thenReturn(expectedUserlistBo);
在when
条件下,上面与对象的相等性失败。 为了解决这个问题,在 UserlistBo 对象中添加了 equals() 和 hashcode()。
@xerx593 感谢您指出
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.