如何编写集成测试代码以验证JPA @Lock(LockModeType.PESSIMISTIC_WRITE)

时间:2018-09-05 09:12:28

标签: spring unit-testing jpa junit integration-testing

我在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);

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

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

0 个答案:

没有答案