首页 > 解决方案 > 如何根据收到的参数模拟从数据库返回的对象?

问题描述

我有一种从数据库查询用户的方法。如果 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);

只是想知道如何实现这一点。

标签: javamockito

解决方案


我认为最简单的方法是使用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);
}

推荐阅读