【发布时间】:2013-03-04 10:58:09
【问题描述】:
在我的项目中,我在进行单元测试时遇到了麻烦。一个问题是,仅进行集成测试编写起来要快得多,并且还可以测试组件是否实际协同工作。单元测试新颖的“算法”左右似乎要容易得多。单元测试服务类它只是感觉错误和无用。
我正在使用 mockito 来模拟 spring 数据存储库(因此是数据库访问)。问题是,如果我告诉模拟存储库在方法调用 getById 上返回实体 A,它显然会返回它,并且服务也会返回它。是的,该服务做了一些额外的事情,但非常小的事情,比如加载惰性集合(来自休眠)。显然我在单元测试中没有任何惰性集合(代理)。
例子:
@Test
public void testGetById() {
System.out.println("getById");
TestCompound expResult = new TestCompound(id, "Test Compound", "9999-99-9", null, null, null);
TestCompoundRepository mockedRepository = mock(TestCompoundRepository.class);
when(mockedRepository.findOne(id)).thenReturn(expResult);
ReflectionTestUtils.setField(testCompoundService, "testCompoundRepository",
mockedRepository, TestCompoundRepository.class);
TestCompound result = testCompoundService.getById(id);
assertEquals(expResult, result);
}
万岁,其余的都成功了。多么惊喜!不是真的没有。
有人可以向我解释我做错了什么吗?否则这种测试的意义何在?我的意思是我告诉返回 expResult 然后它被返回。哇。多么惊喜!感觉就像我在测试 mockito 是否有效,而不是我的 Service。
编辑:
如果出现一些愚蠢的错误,我看到的唯一好处就是在此处留下不需要的行,将返回值设置为 null 或类似的愚蠢。这种情况将被单元测试捕获。 “回报-努力”比似乎仍然很糟糕?
【问题讨论】:
-
您的思路正确,如果您对我的回答有任何其他问题或疑问,请告诉我。
-
如果您的服务具有不只是访问数据库的功能,那么您应该进行测试。一个简单的 CRUD 操作只对在 DB 集成层进行测试才有意义。如果您的
findById服务方法正在调用数据库findById方法,则使用同一数据库/表/存储库中不存在的一些信息来增强结果 - 用户记录的示例可能包括通过街道地址查找他们的 GPS 坐标或反向 IP 查找 - 那么在服务级别进行测试是有意义的。但是模拟 everything 只是对您的测试和模拟框架进行单元测试。
标签: java spring unit-testing spring-data