私は現在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'を使って、それを永久的な解決策に近いものとして、私はそれを試し続けます。 –
更新:私の生産コードはオブジェクトのリストをフィールドとして持っているので、等価フェイルはhibernateの 'PersistentBag'と関係があります。 '@ DataJpaTest'を使うとき、型は' ArrayList'で、 '@ SpringBootTest'では' PersistentBag'です。 (他の回答を編集できませんでした) –