2011-08-08 61 views
3

即使數據庫關閉,我也想單元測試獨立於數據庫的Web層控制器。單元測試期間嘲笑數據源

但是transactionManager bean實例化失敗,因爲連接不能通過具有給定DB憑證的bean dataSource來實現。

此外,我已使用@Transactional,@AfterTransaction@BeforeTransaction註釋,我不想刪除。

有沒有一種方法來定義一個虛擬(或模擬)dataSource我不需要提供任何數據庫憑據但仍然讓我的transactionManager bean被實例化?

+0

您可以用德比創建一個集成測試嗎? –

+0

參見此[模擬交易的代碼示例] [1] [1]:http://stackoverflow.com/questions/11783283/how-do-i-mock-a-transactionmanager-in- a-junit-test-outside-of-the-container – user1313150

回答

0

使用dependency injection。你有兩個標準和有據可查的選項來做到這一點。

  1. 使用框架,如Google Guice。這樣做會有一些開銷,但它會幫助你編寫更好,更可測試的代碼,並且有一些很酷的功能,如對Web層特別有用的範圍設定。
  2. 通過添加一個構造函數,在您自己的代碼中實現DI,該構造函數採用數據源參數或數據源設置方法。在生產中,您將傳入/設置您的生產數據庫,但在單元測試中,您可以使用模擬數據源,它只記錄您的操作/事務。
3

你所描述的是比單元測試更多的集成測試。對於單元測試,不要啓動Spring或事務管理器。只需實例化您的控制器並對其進行單元測試。對於集成測試,請考慮使用H2 in-memory database。 H2的速度非常快(比Derby快得多),並且非常適合需要數據庫的測試。

+0

它可能是,請參閱http://stackoverflow.com/questions/33612399/mock-the-spring-environment-object-in-junit-with-contextconfiguration/ 33627425#33627425 –