如何根据收到的参数模拟从数据库返回的对象?

How to mock the object returned from DB base on the parameter received?

我有一个从数据库查询用户的方法。如果 ID 匹配且创建日期在特定日期内,它将 return 用户

public User findUserCreatedLastTwoDays (String id, Date dateAccepted)
    // select * from User u where u.id = id and u.dateCreated > dateAccepted
    return User;

我想使用 Mockito 为这个简单的方法编写单元测试。我刚开始学习 Mockito,不确定如何模拟用户对象来测试两种不同的场景,当 dateCreated > dateAccepted(return 用户)和 dateCreated < dateAccepted(return 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);
}