【问题标题】:Unit Tests for JPA/Persistence in GeneralJPA/Persistence 的一般单元测试
【发布时间】:2009-11-13 23:02:24
【问题描述】:

您将如何/将如何测试基于持久性引擎构建的超级简单方法。我将使用 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 和单元测试的用处,但我只是不确定要为这样的简单方法做什么样的测试。不是真的在寻找“如何”来创建测试,而是在寻找“什么”来测试。

【问题讨论】:

    标签: unit-testing testing tdd persistence


    【解决方案1】:

    一种哲学是对单元测试非常严格(在我解释我的意思之前,让我说我自己很少遵循这种哲学)。您正在测试 这个 单元是否能完成它应该做的事情,而不是任何依赖软件(例如持久性机制)的工作。

    因此,您的此方法接收参数“输入”并将其传递给 entityManager.persist。这就是它的工作。因此,我们使用某种模拟框架来获取模拟 entityManager,并验证传递给 addCategory 调用的参数确实是由 entityManager 接收的。而已。我们已经测试了该方法的所有职责。

    在更复杂的场景中,这种方法非常有用,您可以测试方法中的所有条件,并找出各种“逐一”和滥用空引用错误等。

    对于这个例子,我不相信我们会找到有趣的错误。 因此,我将使用真正的 EntityManager 设置少量测试套件,从而突破数据的界限。是的,这不是真正的“单元”测试,但我不在乎——我想找出缺陷!

    例如:

    Create a category object with an empty name
    
    Call Add Category
    

    应该发生什么?我假设我们打算抛出异常?因此,我们测试确实会发生这种情况。

    更多测试:

    1. 插入,然后检索 - 验证所有字段
    2. 插入,然后插入重复,我们预计会出现什么错误

    等等。

    【讨论】:

    • 在更广泛的命名世界中,这会是“集成”测试吗?
    • @Drew,是的,它是一种集成测试。我想说的是,考虑集成测试的一种常见方式更关心集成我们刚刚开发的模块,而不是基础设施代码。在这里,我们可能会特别关注一个单元的行为,仔细研究它的极端情况。
    【解决方案2】:

    您可以通过针对嵌入式内存数据库(如 h2)运行测试来执行体面的单元测试,而不是针对现有数据库进行集成测试,该数据库已配置为根据连接上的注释创建其所有表。对于大约 200 个表的数据库,这对我们来说效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 2014-08-13
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多