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

时间:2017-08-10 09:02:49

标签: asynchronous spring-boot kotlin spring-boot-test

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

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

存储库:

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)后进一步让测试进入睡眠状态expectedresult null

任何人都有任何关于可能出错的建议吗?我错过了什么(比如用于测试目的的注释?)。

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

1 个答案:

答案 0 :(得分:0)

我建议不要使用@DataJpaTest,因为您想要使用Spring和JPA存储库测试另一个组件。

Spring引导切片测试,如@WebMvcTest@JsonTest等,只会加载应用程序上下文的一部分,而不是整个事物。它们仅加载特定的自动配置和某些测试依赖性。使用@DataJpaTest

时,我猜想会丢失

我建议使用@SpringBootTest,尽管这也是非常重要的,因为它加载了绝大多数应用程序。