Java 用easymock进行单元测试

Java 用easymock进行单元测试,java,unit-testing,junit,easymock,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(

所以我有下面的方法,我想对它进行单元测试

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);
}
这样就通过了测试用例。但我不确定所有这些嘲笑我实际测试的东西。。因为它只是显示正在调用这些方法。但由于它们被嘲笑,我不确定我是否可以使用assertEquals,即使可以,我也会得到一个异常,因为我认为我必须向上述代码添加更多内容

所以我的问题是:对于上面提到的方法,什么是合适的单元测试用例


谢谢。

我想你的嘲弄倒了。Mock myRepostory,然后设置myRepository Mock以返回一个Criteria对象,并在将该Criteria对象传递给findList时返回一个项目列表

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

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

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

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

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


所有这些都为实际使用集成测试来测试此方法提供了一个很好的案例。最后,您需要做大量工作来验证一些不太有趣的事情,如果您尝试重构代码,您的测试可能会变得非常脆弱。(这是我自己做的,所以我凭经验说。)

非常感谢您抽出时间。但我不明白的是,如果我模仿repository对象并告诉它在findList调用时返回这些项目。然后它会返回我告诉它的内容。那么,当我告诉它返回我想要的东西,这样无论标准是否有效,它都会返回我想要的东西时,我应该与之进行什么比较呢。唯一的问题是,我可以启动项目,然后检查标准是否正确。但是,我还可以用mocking repository检查它是否返回了正确的内容吗?我在这里使用mocking遇到的问题是,一般来说,如果我模拟存储库并告诉它我期望的返回类型,那么我如何测试它是否返回了正确的数据?我遗漏了什么吗?单元测试(与集成测试相反)的要点是您不想测试
CreateMyRepositoryWrapper
。您假设该类将正常工作(希望基于其他测试)。在模拟中,您会说,“假设myRepository执行此操作-此方法是否如我预期的那样工作?”这样,您就可以轻松地测试其他场景,例如
myRepository.findList
返回null-我想从该方法返回null还是空列表?假设
myRepository.findList
抛出一个异常-我想处理该异常还是让它级联?我希望我能多次喜欢你的评论:)
@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);

}