假设我有以下简单的示例界面:
public interface UserDB {
void addUser(User user);
void updateUser(User user);
User getUser(String id);
void deleteUser(String id);
}我想用Mockito编写测试来测试简单的CRUD操作。我想要证实的是:
我的想法是,我需要这样的东西:
UserDB udb = mock(UserDB.class);
when(udb.getUser("1")).thenThrow(new UserNotFoundException());
when(udb.addUser(new User("1"))).when(udb.getUser("1").thenReturn(new User("1"));然而,像最后一行这样的东西并不是正确的Mockito语法。如何检查不同的结果,对于不同的先决条件或不同顺序的方法调用?
发布于 2015-08-17 02:58:27
这样做是一种暗号。实际上,您想编写所有这些代码来查看“用户不能添加两次”,这实际上只是编写一个新类,这与数据库规则无关。
以下是您可以做的事情的一个想法:将验证规则构造为数据库上的装潢工,然后使用模拟的“未修饰”数据库测试装饰器本身。例如:
public class ValidatingUserDB implements UserDB {
private UserDB delegate;
public ValidatingUserDB(UserDB delegate) {
this.delegate = delegate;
}
public void addUser(User user) {
User oldUser = delegate.get(user.getId());
if (oldUser != null) throw new IllegalArgumentException(
"User " + user.getId() + " already exists!";
delegate.addUser(user);
}
}然后,你可以这样写你的测试:
@Test(expected=IllegalArgumentException.class)
public void testNoDuplicateUsers() {
User sampleUser = new User("1");
UserDB delegate = mock(UserDB.class);
when(delegate.getUser(any(User.class))).thenReturn(sampleUser);
UserDB db = new ValidatingUserDB(delegate);
db.addUser(sampleUser);
}
public void testAddingUser() {
User sampleUser = new User("1");
UserDB delegate = mock(UserDB.class);
UserDB db = new ValidatingUserDB(delegate);
db.addUser(sampleUser);
verify(delegate).getUser(sampleUser);
verify(delegate).addUser(sampleUser);
}通过将验证行为与CRUD行为分开,您可以以一种不涉及用超级复杂的答案规则重写所有这些测试的方式编写测试。
https://stackoverflow.com/questions/32041833
复制相似问题