2017-08-10 14 views
0

私は現在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)expectedresultの両方を呼び出した後にテスト睡眠を作る場合は、null

誰もが間違っている可能性がどのようになどの任意の提案を持っていますか?私は何かを見逃していますか?(テスト目的のアノテーションのようなものですか?)

また、アプリケーションを起動すると、すべて正常に動作し、自分のコントローラーに休憩をかけます。

答えて

0

JPAリポジトリとともにSpringで別のコンポーネントをテストしたいと思っているので、@DataJpaTestを使用しないことをお勧めします。

スプリングブートスライステストでは、@WebMvcTest@JsonTestなどのように、アプリケーションコンテキストのスライスだけがロードされ、全体がロードされるわけではありません。特定の自動構成と特定のテストの依存関係だけをロードします。私が使用していると思いますか?@DataJpaTest

@SpringBootTestを使用することをお勧めしますが、これはアプリケーションの大半をロードするのでかなり重いこともあります。

+0

結果が何かになります。まだassertは同等で失敗していますが(私はカスタムequalsメソッドをまだ実装していませんが、これは '@DataJpaTest'アノテーションの問題ではなく、' @ Async'なしで実行しています)。単純な 'println()'を使うと、オブジェクトに同じプロパティがあることを伝えることができます。代わりに '@ SpringBootTest'を使って、それを永久的な解決策に近いものとして、私はそれを試し続けます。 –

+0

更新:私の生産コードはオブジェクトのリストをフィールドとして持っているので、等価フェイルはhibernateの 'PersistentBag'と関係があります。 '@ DataJpaTest'を使うとき、型は' ArrayList'で、 '@ SpringBootTest'では' PersistentBag'です。 (他の回答を編集できませんでした) –

関連する問題