一般的JPA /持久性单元测试

时间:2009-11-13 23:02:24

标签: unit-testing testing tdd persistence

如何/您将测试构建在持久性引擎上的超简单方法。我将使用JPA,但任何持久性机制我肯定都有其等价物。

例如......

@Entity
public class Category {

   @Id @GeneratedValue
   private long id;

   @NotNull @NotEmpty
   private String name;

   @NotNull
   @ManyToOne
   private User user;

   //...Getters/Setters...
}

@Stateless
public void CategoryServiceImpl implements CategoryService {

   @PersistenceContext EntityManager entityManager;
   public void addCategory(Category input) {
      entityManager.persist(input);
   }
}

哪种测试对addCategory有用。我可以看到TDD和单元测试的有用性,但我不确定对于这样的简单方法要做什么样的测试。并不是真的在寻找“如何”来创建测试,而是“测试什么”。

2 个答案:

答案 0 :(得分:0)

一个哲学是对单元测试非常顽固(在我解释我的意思之前,让我说我自己很少遵循这个哲学)。您正在测试单元执行的操作,而不是任何依赖软件(例如持久性机制)的工作。

所以你的这个方法接收一个参数“input”并将它传递给entityManager.persist。这是它的工作。因此,我们使用某种类型的模拟框架来获取模拟的entityManager,并且我们验证传递给addCategory调用的参数确实是通过entityManager接收的。而已。我们已经测试了该方法的所有职责。

在更复杂的场景中,这个appraoch非常有用,你可以测试方法中的所有条件,并选择各种“off-by-one”和滥用null引用错误等。

对于这个例子,我不相信我们会找到有趣的错误。 因此,我将使用真正的EntityManager设置一些小测试套件,这将推动数据的边界。是的,这不是真正的“单元”测试,但我不在乎 - 我想找到缺陷!

例如:

Create a category object with an empty name

Call Add Category

应该怎么办?我假设我们打算抛出一个异常?所以我们测试的确发生了什么。

更多测试:

  1. 插入,然后检索 - 验证所有字段
  2. 插入,然后插入副本,我们期待什么错误
  3. 等等。

答案 1 :(得分:0)

不是对现有数据库进行集成测试,而是通过对嵌入式内存数据库(如h2)运行测试,而不是对现有数据库进行集成测试,该数据库已配置为根据连接上的注释创建所有表。这适用于我们大约200个表的数据库。