2017-08-10 35 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)expectedresultnull

任何人有任何建議,這可能是錯後?我是否錯過了某些東西(如用於測試目的的註釋?)。

再說一次,當我啓動應用程序,並對我的控制器進行其他調用時,一切正常。

回答

0

我建議不要使用@DataJpaTest,因爲您想要使用Spring測試另一個組件以及JPA存儲庫。

Spring Boot Slice測試,像@WebMvcTest,@JsonTest等只加載一個應用程序上下文的切片,而不是整個事情。它們只加載特定的自動配置,以及某些測試依賴關係。我猜想在使用時會丟失@DataJpaTest

我會建議使用@SpringBootTest,雖然這也可能是相當重的,因爲它加載,絕大多數應用程序。

+0

這使得結果成爲一些東西。儘管現在assert仍然失敗(我還沒有實現自定義的equals方法,但這不是'@ DataJpaTest'註釋的問題,運行時沒有'@ Async')。用一個簡單的'println()'我可以告訴對象具有相同的屬性。我將繼續用'@ SpringBootTest'來代替它,因爲它更接近永久解決方案atm。 –

+0

更新:平等失敗與hibernate的PersistentBag有關,因爲我的生產代碼有一個對象列表作爲一個字段。當使用'@DataJpaTest'時,類型是'ArrayList','@SpringBootTest'是'PersistentBag'。 (無法編輯我的其他答案) –

相關問題