我目前正在实现一些@Async
与 spring-boot 一样的存储库方法,当我实际启动应用程序时,它的工作方式与它应该的一样,但是在运行集成测试时,事情开始变得很奇怪。
我已经设置了一个展示问题的小项目。
存储库:
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)
两者之后进一步使测试睡眠expected
并且result
是null
有人对可能出现的问题有任何建议吗?我是否缺少某些东西(例如用于测试目的的注释?)。
同样,当我启动应用程序并对我的控制器进行休息调用时,一切正常。