[英]What is the proper way to test a multi-step process in a Java Spring/Hibernate/Maven project?
最初,我只有一个进行单元测试所需的Java Servlet。 我想确保它可以正确处理请求,因此我在jUnit测试中使用了Spring的MockHttpServletRequest,该方法效果很好。 非常简单的单元测试。
现在,我想扩展测试,并且要进行一系列数据库事务处理并模拟http servlet请求,以模拟一段时间内使用系统的用户。
我想我可以将所有这些都塞进一个单元测试中,但这似乎不正确,因为这会违反单元测试的精神。
那么以这种特定顺序测试一系列事件的正确方法是什么?
这是我到目前为止的精简版本:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"testContext.xml"})
public class servletTest {
//Injected request
@Resource(name="mockTestServletRequest")
MockHttpServletRequest request;
@Test
public void mockRequest() {
//perform a mock servlet request
}
那么,我是否仅通过在已有的方法上方和下方添加更多用@Test注释的方法来模拟事件的时间轴? 我保证这些方法将按列出的顺序执行吗?
那将是一个集成测试。 看一下spring的测试框架 。 这意味着您将启动Spring上下文,并运行所有内容。 您可以使用内存数据库,也可以使用独立数据库。
当一切开始后,您可以注入您的控制器的一个实例并触发一个请求,然后再发起一个请求。 默认情况下,每个方法都在事务中,该方法完成后会回滚,因此不必担心会污染数据库。
从测试心态的角度来看,我确实同意您的观点,即真正的单元测试应该完全是这样:可以测试代码中的单个接触点且不能超出此范围的东西。
由于您正在使用Maven,因此实际上有一些不错的选择。 这里关于codehaus的建议可能很有价值。 通过模块化“集成单元测试”,您可以将其分配给一个单独的目标,并让您更智能,更有组织的测试在那里生活。
我使用的另一个选项是在测试上添加注释,如下所示:
@IfProfileValue(name="integration", value="true")
这使您可以设置是否只运行真正的单元测试或集成测试的参数。
最后,如果您正在使用开发数据库并且希望继续这样做,那很好,但是如果这是一个连续的测试并且您没有回滚,那么Mockito或其他模拟框架可能会很好地为您服务。 不过,这实际上取决于测试的环境。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.