【问题标题】:What is the proper way to test a multi-step process in a Java Spring/Hibernate/Maven project?在 Java Spring/Hibernate/Maven 项目中测试多步骤过程的正确方法是什么?
【发布时间】:2012-03-06 18:58:21
【问题描述】:

我最初只有一个需要进行单元测试的 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 注释的方法来模拟事件时间线?我能保证这些方法会按照列出的顺序执行吗?

【问题讨论】:

  • 你知道 Adam Bien 的 Unit Testing for Java EE
  • @zellus 我刚读了那篇文章,它不太适用于我的情况。我已经有了一个有效的单元测试,现在我正试图弄清楚该怎么做,因为我希望测试从一个简单的单元测试发展为一个更强大的多步骤测试。

标签: java spring hibernate testing tdd


【解决方案1】:

这将是一个集成测试。看看spring's testing framework。这意味着您将启动您的 spring 上下文,并让一切运行。您可以使用内存数据库,也可以使用独立数据库。

当一切启动后,您可以注入您的控制器实例并触发请求,然后再触发另一个。默认情况下,每个方法都在一个事务中,当方法完成时会回滚,所以不用担心污染数据库。

【讨论】:

  • 我在下面添加了一个代码 sn-p 和一个问题。使用 Test 注释的多个方法是否会被视为有效的集成测试?
【解决方案2】:

从测试心态的角度来看,我同意你的观点,真正的单元测试应该是这样的:测试代码中的单个接触点,而不是超越那个。

由于您使用的是 Maven,因此您实际上有一些不错的选择。 here on codehaus 的建议可能很有价值。通过模块化您的“集成单元测试”,您可以将其分配给一个单独的目标,并让您的更智能和编排的测试在那里进行。

我使用的另一个选项是在测试中添加如下注释:

@IfProfileValue(name="integration", value="true")

这允许您设置是否只运行真正的单元测试或集成测试的参数。

最后,如果您正在使用开发数据库并希望继续这样做,那很好,但如果这是一个持续测试并且您没有回滚,那么Mockito 或其他模拟框架可能会为您提供很好的服务。不过,这实际上取决于您的测试环境。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多