java - 使用嵌入式 Cassandra 加速 Spring MockMvc 集成测试

标签 java junit cassandra spring-test

我们正在使用 MockMvc Framework 来测试带有 JUnit 的 Spring Controller 。 Controller 返回一个 DefferedResult

mockmvc.perform 如下所示

mockMvc.perform(post("/customer")
                .accept(APPLICATION_JSON)
                .header(AUTH_TOKEN_KEY, "xyz")
                .header(FROM_KEY, "email@gmail.com")
                .content(json)
                .contentType(APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(request().asyncStarted());

这需要很多时间。 我们正在使用嵌入式 cassandra,因此需要花费大量时间。

我也试过了,还是一样。

MvcResult mvcResult = mockMvc.perform(post("/customer")
            .accept(APPLICATION_JSON)
            .header(AUTH_TOKEN_KEY, "xyz")
            .header(FROM_KEY, "email@gmail.com")
            .content(json)
            .contentType(APPLICATION_JSON))
            .andReturn();

mockMvc.perform(asyncDispatch(mvcResult))
            .andExpect(status().isOk())
            .andExpect(request().asyncStarted());

我有数百个测试,因此构建过程真的很慢。

有没有办法,使用 JUnit 我可以说在另一个线程中执行请求并等待响应以断言结果,或者任何其他加速它的好方法。

谢谢

最佳答案

您真的需要应用程序的 Cassandra/持久层来进行此测试吗?

如果答案是否定的,或者如果答案不是大量的测试用例,那么您可以在运行测试时注入(inject)另一个持久性存储库。为此,您可以使用 Spring 内置的 Profile 功能并相应地注释您的测试,例如:

@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfile("StubPersistence")
public class WebLayerIntegrationTests {
...
}

然后您可以为您的测试使用 Cassanda-Repository 的 stub 版本,允许使用静态数据:

@Profiles("StubPersistence")
@Repository
public class StubCassandaRepository {
    ...
}

这个类可以由一个简单的数据结构支持,比如 HashSet 或类似的,这取决于你的用例。这种方法的可能性在很大程度上取决于您的软件架构,因此如果您不能消除 Cassandra 依赖项,则可能无法实现。

我也想知道你是否真的需要数百个测试,需要你完整的应用程序,包括 web 层。您当然可以通过支持单元测试而不是集成测试来显着加快测试速度,这样您就不需要初始化 Spring-Context。还取决于您的应用程序和软件架构。

Spring-Boot 1.4 中还将有一些测试改进,允许您专门初始化应用程序的单个切片以进行测试(如持久性或 Web 层): https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4

所以,我最好的建议是: 如果你想测试你的 Controller ,只测试你的 Controller 而不是你的持久层,而是将它 stub 。如果你想测试你的持久层,从你的持久层的接口(interface)开始,不要使用你的 Controller 作为测试接口(interface)。

关于java - 使用嵌入式 Cassandra 加速 Spring MockMvc 集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36132386/

相关文章:

java - 映射键在 Groovy 中是不是对象?

java - 如何让底部Sheet在不同屏幕尺寸下调整大小?

java - 有没有一种简单的方法可以在Java中搜索可能包含行分隔符的文本中的句子?

使用 @Autowired 注释进行 Spring JUnit 测试

java - 应该如何处理模拟对象的差异?

java - 是否可以在 Intellij IDEA 中创建顶级测试运行配置,以便我的所有 JUnit 测试都可以使用它运行?

java - WedDriverException : java. 初始化 RemoteWebDriver 时 util.HashMap 无法转换为 java.lang.String

cassandra - 如何将 blob 插入 Cassandra 列族?

cassandra - CQLSH:将unix时间戳转换为日期时间

sql - 带有 SSTable 附加二级索引的 Cassandra 与关系数据库