我目前使用spring-boot實現了一些存儲庫方法,如@Async
,它的工作方式應該是在我實際啓動應用程序時,但在運行集成測試時,開始行動怪異。@DataJpaTest和@Async CRUDRepository方法不一起工作
我已經設置了一個展示問題的小項目。
庫:
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
任何人有任何建議,這可能是錯後?我是否錯過了某些東西(如用於測試目的的註釋?)。
再說一次,當我啓動應用程序,並對我的控制器進行其他調用時,一切正常。
這使得結果成爲一些東西。儘管現在assert仍然失敗(我還沒有實現自定義的equals方法,但這不是'@ DataJpaTest'註釋的問題,運行時沒有'@ Async')。用一個簡單的'println()'我可以告訴對象具有相同的屬性。我將繼續用'@ SpringBootTest'來代替它,因爲它更接近永久解決方案atm。 –
更新:平等失敗與hibernate的PersistentBag有關,因爲我的生產代碼有一個對象列表作爲一個字段。當使用'@DataJpaTest'時,類型是'ArrayList','@SpringBootTest'是'PersistentBag'。 (無法編輯我的其他答案) –