繁体   English   中英

在Java Spring / Hibernate / Maven项目中测试多步骤过程的正确方法是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM