首页 > 解决方案 > 如何编写集成测试代码来验证 JPA @Lock(LockModeType.PESSIMISTIC_WRITE)

问题描述

我正在使用带有 JPA 存储库的 spring。

我试图从一个表中获取序列号,并在一些操作后更新相同的。

在这种情况下,我必须为多线程事务编写测试代码,即如果一个请求从选择查询中获取序列号,那么在第一个请求完成之前,另一个请求无法访问它。所以我在互联网上搜索并找到了 JPA 的解决方案,即

 @Lock(LockModeType.PESSIMISTIC_WRITE)

我已经用我的存储库功能实现了上述语句,即

@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query(value = "from FileNumberSequence where headBasicId = :headBasicId and headPrimaryId= :headPrimaryId and year = :year")
public FileNumberSequence getFileNumberSequence(@Param("headBasicId") Long headBasicId, 
                  @Param("headPrimaryId") Long headPrimaryId, @Param("year") Integer year);

可能上面的代码在生产环境中可以正常工作,但我必须为此编写测试代码。

所以我用两个交易测试了它,即

TransactionStatus status1 = transactionManager.getTransaction(new DefaultTransactionDefinition());

this.mockMvc
 .perform(MockMvcRequestBuilders.post("/file").contentType(MediaType.APPLICATION_JSON)
 .content(new ObjectMapper().writeValueAsString(this.fileDTO)))
 .andExpect(MockMvcResultMatchers.status().isOk());

transactionManager.commit(status1);
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
transactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus status2 = transactionManager.getTransaction(transactionDefinition);

this.mockMvc
 .perform(MockMvcRequestBuilders.post("/file").contentType(MediaType.APPLICATION_JSON)
 .content(new ObjectMapper().writeValueAsString(this.fileDTO)))
 .andExpect(MockMvcResultMatchers.status().isOk());

transactionManager.commit(status2);

在上述情况下,第一个请求会触发选择查询,但之后它不再工作。

请提供相同的解决方案。如果您知道任何其他方法来编写相同的测试代码,请解释。

标签: springunit-testingjpajunitintegration-testing

解决方案


推荐阅读