@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
虽然这也可以是相当重的,因为它加载,绝大多数应用程序。