首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地模拟简单的CRUD接口?

如何正确地模拟简单的CRUD接口?
EN

Stack Overflow用户
提问于 2015-08-17 02:06:20
回答 1查看 2.3K关注 0票数 1

假设我有以下简单的示例界面:

代码语言:javascript
复制
public interface UserDB {
    void addUser(User user);
    void updateUser(User user);
    User getUser(String id);
    void deleteUser(String id);
}

我想用Mockito编写测试来测试简单的CRUD操作。我想要证实的是:

  • Update/get/delete工作仅当用户在添加之前添加'add‘
  • 如果用户在使用“删除”之前被删除,则它们将失败。
  • 已经创建的用户不能再次创建。
  • 等。

我的想法是,我需要这样的东西:

代码语言:javascript
复制
    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语法。如何检查不同的结果,对于不同的先决条件或不同顺序的方法调用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-17 02:58:27

这样做是一种暗号。实际上,您想编写所有这些代码来查看“用户不能添加两次”,这实际上只是编写一个新类,这与数据库规则无关。

以下是您可以做的事情的一个想法:将验证规则构造为数据库上的装潢工,然后使用模拟的“未修饰”数据库测试装饰器本身。例如:

代码语言:javascript
复制
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);
  }
}

然后,你可以这样写你的测试:

代码语言:javascript
复制
@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行为分开,您可以以一种不涉及用超级复杂的答案规则重写所有这些测试的方式编写测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32041833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档