使用easymock对方法进行单元测试

时间:2012-07-18 23:33:22

标签: java unit-testing junit easymock

所以我有波纹管方法,我想对它进行单元测试。

public List<Project> getProjects(Task task) {

    Criteria<Project> criteria = this.myRepository.getCriteria(Project.class);
    criteria.add(Comparison.eq("order", task.getOrder()));
    criteria.addOrder(Order.asc("projectNumber"));
    return this.myRepository.findList(Project.class, criteria);
}

因此它实际上获取了任务对象(它是一个JPA模型对象)并抛出项目表并查找具有此项目订单的所有项目。订单在两个表中都很常见。

无论如何,查询本身不是那个imp。它查询db并返回一些数据。现在我的问题是如何使用easymock对此进行单元测试?

@Test
public void testGetProjects() throws Exception {
    myRepository = new CreateMyRepositoryWrapper(); --> This is a class which just returns the entityManger. but here we can consider this as a pojo.

    Task task = EasyMock.createNiceMock(Task.class);
    Order bom = EasyMock.createNiceMock(Order.class);        
    Project project= EasyMock.createNiceMock(Project.class);

    project.setProjectName("project"); ------> Can I call a seeter on a mocked object?

    project.setProjectNumber("1");

    EasyMock.replay(project);

    List projects= new ArrayList(Arrays.asList(project));
    bom.setProjects(projects);  ------------> Does it make sense to do this?

    EasyMock.expect(task.getOrders()).andReturn(bom);
    TestClass instance = new TestClass();
    instance.setMyRepository(myRepository);

    EasyMock.replay(task,bom);
   instance.getProjects(task);

}

所以这通过了测试用例。但我不确定所有那些嘲笑我实际上正在测试的东西。因为它只是表明正在调用这些方法。但是因为他们被嘲笑我不确定我是否可以使用assertEquals,即使我可以得到一个例外,因为我必须在上面的代码中添加更多内容。

所以我的问题:对于提到的方法应该是什么样的单元测试用例?

感谢。

1 个答案:

答案 0 :(得分:1)

我认为你有这种嘲讽倒退。模拟myRepostory,然后设置myRepository模拟以返回Criteria对象,并在将Criteria对象传递给findList时返回项目列表。

任务,订单和项目可能只是实例化。

现在,instance.getProjects(task)将返回一些内容。您可以检查以确保返回的内容与您应该从findList返回的内容相同。现在你已经测试了一些东西,虽然没什么特别有趣的。

您可能希望验证条件对象在传递给findList之前是否已正确设置。要做到这一点,您要么必须将标准设为模拟,那么您可以设置对所调用方法的期望。这里棘手的部分是Hibernate Restriction类没有非默认的equals实现,所以你必须编写自己的匹配器来检查传递给条件的Restrictions是否与你期望的Restrictions相同(功能上)。 / p>

另一种可能性是将标准设置为实际的Criteria对象。 (您仍然设置myRepository模型以返回它。)然后,在调用函数之后,您可以使用toString()方法上的某些子字符串匹配或您知道的任何其他方式来检查Criteria对象。

最终(单元测试)的可能性是不使用Criteria对象的模拟框架,但是您编写的一些手工编码框架允许您检查添加到其中的所有限制。

所有这些都是这个方法的一个很好的例子,实际上是通过集成测试进行测试。你最后做了很多工作来验证一些不太有趣的东西,如果你试图重构代码,你的测试会变得非常脆弱。 (我自己完成了,所以我从经验中说出来。)