java - 如何根据收到的参数模拟从数据库返回的对象?
问题描述
我有一种从数据库查询用户的方法。如果 ID 匹配并且创建的日期在特定日期内,它将返回用户
public User findUserCreatedLastTwoDays (String id, Date dateAccepted)
// select * from User u where u.id = id and u.dateCreated > dateAccepted
return User;
我想使用 Mockito 为这个简单的方法编写一个单元测试。我刚开始学习 Mockito,但不确定如何模拟 User 对象来测试 2 个不同的场景,即 dateCreated > dateAccepted(返回用户)和 dateCreated < dateAccepted(返回 null)时。
我需要写一些这样的条件吗
User testUser = new User();
testUser.setDateCreated(new Date() - 3);
if (dateCreated > dateAccepted)
when(findUserCreatedLastTwoDays(id, dateAccepted)).thenReturn(testUser);
else
when(findUserCreatedLastTwoDays(id, dateAccepted)).thenReturn(null);
只是想知道如何实现这一点。
解决方案
我认为最简单的方法是使用Answer:
when(findUserCreatedLastTwoDays(id, dateAccepted)).thenAnswer(new Answer<User> () {
User answer(InvocationOnMock invocation) {
return dateCreated > dateAccepted ? testUser : null;
}
}
这样做的好处是使用当时的当前值,而不是创建模拟时的值。如果这对您不重要,您也可以使用建议的代码:
if (dateCreated > dateAccepted) {
when(findUserCreatedLastTwoDays(id, dateAccepted)).thenReturn(testUser);
} else {
when(findUserCreatedLastTwoDays(id, dateAccepted)).thenReturn(null);
}