如何/您将测试构建在持久性引擎上的超简单方法。我将使用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和单元测试的有用性,但我不确定对于这样的简单方法要做什么样的测试。并不是真的在寻找“如何”来创建测试,而是“测试什么”。
答案 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 :(得分:0)
不是对现有数据库进行集成测试,而是通过对嵌入式内存数据库(如h2)运行测试,而不是对现有数据库进行集成测试,该数据库已配置为根据连接上的注释创建所有表。这适用于我们大约200个表的数据库。