2020-12-08 Spring Boot の @MockBean をやめた
Spring Boot の @MockBean
(@MockkBean
) をやめた。
Spring Boot 2.3.x 。 MockK 1.10.x 。 SpringMockK 2.0.x 。
Spring Boot の @MockBean
(や SpringMockK の @MockkBean
) を使用すると ApplicationContext
のキャッシュが効かず別の ApplicationContext
が作られてしまう。
Spring のテストフレームワークはテスト間でアプリケーションコンテキストをキャッシュし、同じ構成を共有するテストでコンテキストを再利用しますが、@MockBean または @SpyBean の使用はキャッシュキーに影響し、コンテキストの数を増やす可能性が高くなります。
この動作が原因で ApplicationContext
ごとにコネクションプールを保持したオブジェクトがつくられて解放もされないため PostgreSQL のコネクション数の上限に達する問題が起きた。
この問題の対策のために @MockkBean
の使用をやめた。 @Autowired
で対象のオブジェクトを取得したあと MockK の mockkObject
で mock することにした。
@ActiveProfiles("test")
@SpringBootTest
class XTest(@Autowired private val service: XService) {
// @MockkBean private lateinit var service: XService // こう書きたいが書けない
@Test
fun test() {
mockkObject(service) {
every { service.method() } returns Unit
// ...
}
}
}
テストで自由に mock へ切り替えられない DI って意味ある?
- Spring Boot https://github.com/spring-projects/spring-boot
- MockK https://github.com/mockk/mockk
- SpringMockK https://github.com/Ninja-Squad/springmockk
macOS Big Sur で Control キーを 2 回押すと音声入力が開始されるのを無効化した。
- 画面左上のアップルロゴをクリック
- メニューから「システム環境設定...」をクリック
- 「システム環境設定」から「キーボード」をクリック
- 「キーボード」から「音声入力」タブをクリック
- 「ショートカット」のドロップダウンリストから「オフ」を選択する