@DataJpaTest和@Async CRUDRepository方法不能一起工作

我目前使用spring-boot作为@Async实现了一些存储库方法,当我实际启动应用程序时,它的工作方式应该是这样,但是在运行集成测试时,事情开始变得很奇怪。

我已经设置了一个展示问题的小项目。

库:

 interface MyObjectRepository : CrudRepository<MyObject, Long> { @Async fun findBySomething(something: String): ListenableFuture<MyObject?> } 

应用:

 @SpringBootApplication @EnableAsync class Application { private val log = LoggerFactory.getLogger(Application::class.java) } fun main(args: Array<String>) { SpringApplication.run(Application::class.java, *args) } 

而我的测试案例:

 @RunWith(SpringRunner::class) @DataJpaTest class MyObjectRepositoryTest { @Autowired lateinit var target: MyObjectRepository @Before fun `init`() { target.deleteAll() } @Test fun `should be able to find MyObject`() { val m = MyObject("something") val expected = target.save(m) val futureResult = target.findBySomething("something") val result = futureResult.get() assert.that(result, equalTo(expected)) } } 

我的结果:

expected == the object (good)

result == null (bad)

如果我在存储库的类级别上启用@Async ,结果会翻转。

如果我在调用target.save(m)之后进一步使测试进入睡眠状态, result都是null

任何人有什么建议可能是错的? 我是否错过了某些东西(如用于测试目的的注释?)。

同样,当我启动应用程序时,一切工作正常,并对我的控制器进行休息。

我建议不要使用@DataJpaTest因为你想用Spring来测试另一个组件以及JPA存储库。

Spring Boot切片测试,比如@WebMvcTest@JsonTest等只加载应用程序上下文的一个片段,而不是整个事物。 它们只加载特定的自动配置,以及某些测试依赖关系。 当使用@DataJpaTest时,我猜想会丢失

我建议使用@SpringBootTest虽然这也可以是相当重的,因为它加载,绝大多数应用程序。