2009-11-13 103 views
0

您将如何测试构建在持久性引擎上的超简单方法?我将要使用JPA,但是我确信任何持久性机制都有其等价物。单元测试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

的一个理念是非常强硬的单元测试(之前,我解释一下我的意思是,让我说,我很少遵循这一理念我自己)。你正在测试这个单元做它应该做的事情,而不是任何依赖软件(例如持久性机制)的工作。

所以你的这种方法接收一个参数“输入”并将其传递给entityManager.persist。这是工作。所以我们使用某种类型的模拟框架来获取一个模拟的entityManager,并且验证传递给addCategory调用的参数是否会被我的entityManager所接收。而已。我们已经测试了该方法的所有责任。

在更复杂的情况下,这是appraoch非常有用,您测试的方法,所有的条件,拿起各种“减一”和滥用空引用错误等

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

例如:

Create a category object with an empty name 

Call Add Category 

应该发生什么?我认为我们打算抛出异常?所以我们测试确实发生了这种情况。

一些测试:

  1. 插入,然后检索 - 验证所有领域
  2. 插入,然后插入一个重复的,有什么错误,请我们预计

等。

+0

在更广泛的命名事物世界中,这会是“整合”测试吗? – Drew 2010-01-07 21:13:55

+0

@德鲁,是的,它是一种集成测试。我要说的是,考虑集成测试的常用方法更关心的是,我们刚刚开发,而不是基础设施的代码模块整合。在这里,我们可能会专注于单位的行为,仔细研究其案例。 – djna 2010-01-07 22:32:02

0

,而不是针对现有的数据库集成测试,你可以通过对嵌入在像已被用于创建基于连接的注释所有的表H2内存数据库运行测试执行体面的单元测试。对于我们来说,这对于大约两百张表的数据库来说效果很好。