blog.bouzuya.net

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 の使用はキャッシュキーに影響し、コンテキストの数を増やす可能性が高くなります。

https://spring.pleiades.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-testing-spring-boot-applications-mocking-beans

この動作が原因で ApplicationContext ごとにコネクションプールを保持したオブジェクトがつくられて解放もされないため PostgreSQL のコネクション数の上限に達する問題が起きた。

この問題の対策のために @MockkBean の使用をやめた。 @Autowired で対象のオブジェクトを取得したあと MockK の mockkObject で mock することにした。

https://mockk.io/

@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 って意味ある?


macOS Big Sur で Control キーを 2 回押すと音声入力が開始されるのを無効化した。

  • 画面左上のアップルロゴをクリック
  • メニューから「システム環境設定...」をクリック
  • 「システム環境設定」から「キーボード」をクリック
  • 「キーボード」から「音声入力」タブをクリック
  • 「ショートカット」のドロップダウンリストから「オフ」を選択する