【问题标题】:@DataJpaTest and @Async CRUDRepository method not working together@DataJpaTest 和 @Async CRUDRepository 方法不能一起工作
【发布时间】:2018-01-18 10:20:08
【问题描述】:

我目前正在使用 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) 后进一步使测试休眠,expectedresult 都是null

有人对可能出现的问题有任何建议吗?我是否遗漏了某些内容(例如用于测试目的的注释?)。

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

【问题讨论】:

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


    【解决方案1】:

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

    Spring Boot 切片测试,如 @WebMvcTest@JsonTest 等,仅加载应用程序上下文的一部分,而不是全部。它们只加载特定的自动配置,以及某些测试依赖项。我猜在使用@DataJpaTest时会丢失它

    我建议使用@SpringBootTest,尽管它在加载绝大多数应用程序时也可能很重。

    【讨论】:

    • 这让结果变成了某种东西。尽管现在断言仍然因相等而失败(我还没有实现自定义的 equals 方法,但这不是@DataJpaTest 注释的问题,在没有@Async 的情况下运行)。通过一个简单的println() 我可以告诉对象具有相同的属性。我将继续使用@SpringBootTest 来处理它,因为它更接近永久解决方案。
    • 更新:相等失败与休眠的PersistentBag 有关,因为我的生产代码有一个对象列表作为字段。使用@DataJpaTest 时,类型为ArrayList,使用@SpringBootTest 时,类型为PersistentBag。 (无法编辑我的其他答案)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2014-01-07
    • 2019-08-17
    • 2016-11-23
    • 2019-02-18
    • 2015-05-16
    相关资源
    最近更新 更多