2012-07-18 26 views
0

所以我有我要执行单元测试的波纹管方法。使用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。它查询数据库并返回一些数据。现在我的问题如何使用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

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

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

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

您可能想要验证标准对象在传递给findList之前是否设置正确。要做到这一点,你必须制定一个模拟标准,然后你可以设定你所要求的方法的期望。这里棘手的部分是Hibernate Restriction类没有非默认的equals实现,因此您必须编写自己的匹配程序来检查传递给条件的限制与您期望的限制相同(功能上)。

另一种可能性是将条件设置为实际的Criteria对象。 (你仍然设置你的myRepository模拟来返回它)。然后,在函数被调用之后,你可以用toString()方法或者你知道检查Criteria对象的其他任何方式检查内容。

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

所有这些都为这种方法提供了一个很好的例子,实际上它正在集成测试中进行测试。你做了很多工作来验证一些不是很有趣的事情,如果你试图重构代码,你的测试会变得非常脆弱。 (我自己做过,所以我从经验中发言。)

+0

非常感谢您的时间。但我不明白的是,如果我嘲笑仓库对象,并告诉它在findList调用时返回这些项目。然后它会返回我所说的。那么我应该怎样比较它,当我告诉它返回我想要的东西时,它会返回我想要的东西,无论标准是否有效。唯一的事情是我可以初始项目,然后检查标准是否正确。但是,我也可以检查它是否也会使用嘲讽库来返回正确的东西? – Sara 2012-07-19 17:52:12

+0

我在这里嘲笑的问题是,如果我嘲笑知识库并告诉它我期待的返回类型,那么我怎样才能测试它是否返回正确的数据呢?我错过了什么吗? – Sara 2012-07-19 17:54:47

+1

单元测试(而不是集成测试)的要点是你不想测试'CreateMyRepositoryWrapper'。你认为那个班级会正常工作(基于其他测试,你希望)。在嘲笑中,你说,“假设myRepository做到这一点 - 这种方法是否按我的预期工作?”通过这种方式,您可以轻松测试其他场景,例如'myRepository.findList'返回null - 是否要从此方法返回null或空列表?假设'myRepository.findList'抛出一个异常 - 我想处理这个异常还是让它级联? – jhericks 2012-07-19 20:12:27