💡この記事でわかること・解決すること
Spring Integration Test でCassandraへの接続をモックしたいときにハマったのでその解決方法を書いておく。
そもそもAPIの結合テストとは
バックエンドでのマイクロサービス間の開発では、例えばBFF APIから荷物API → 配送方法APIなど API同士の通信が往々として増えてきます。そんなときに1APIとしてはJSONファイルを保存しておいて、JSONファイルの中身の一部を比較するテストを書いておけば、大規模リファクタしたときや新機能追加したときの開発でデグレードが起きづらくなります。
しかし、マイクロサービス間では1APIだとしてもHTTP通信以外の別Databaseへの接続も増えてきます。
こんな例のようにAPIだけでなくDBと接続も増えてくるので単純なHTTP Mockだけでは対応しきれない感じです。
おそらくシンプルなHTTPと通信してるだけであれば karate なんかを使ってセルフE2Eみたいなものも書けると思います。
SpringのAPI Integration Testについて
もちろんAPI Testingをしたいわけなので一時的にSpring API Serverを立ち上げます。その際に外部接続するクラスをモック化しておいて、仮の値を設定できるようにします。
APIに対してリクエストを行い、レスポンス値が正しいのか検証を行います。Springを立ち上げるのに少し時間がかかるのでユニットテストで使うのには不向きです。
Cassandraへ接続したときにハマったこと
SpringのIntegration Testでは
MockBean
を使用して対象のHTTPやExternal DBとのConfigクラスをモック化できるのですが、Spring CassandraのConfigクラスを設定しても解決しませんでした。接続設定を上書きするようにして自分たちで管理しているクラスとか
@MockBean CassandraClient cassandraClient; @MockBean HogeDBClient hogeDBClient; @Test void テストする() {}
そんなときはたいていSpringのAuto Configurationを見直しましょう。要は何もしなくても接続設定をFW自体が効かせますよという設定群だと思っています(間違ってたら🙏)
✌️解決方法
このままだとSpringのAuto Configurationが効いてしまうので、テスト時だけ無効化しましょう。excludeで無効化できます。
一応もとのソースコード自体に効かせる設定があったので載せておきます。OSSでよかった。。。
property-test.ymlを使う方法
spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration
Integration Testのクラスファイルに直接書く
@EnableAutoConfiguration(exclude={CassandraAutoConfiguration.class, ReactiveCassandraConfig.class}) public TestClass {}
🏌️♂️おわりに
少しマニアックな内容でしたが、Springを使う場合にご親切にやってくれてることが多いので、ライブラリを使うことがある場合に気をつけて実装したいですね!
個人的にSpringのテストは難しい気がしているのでちゃんと理解して使いこなせるように他人に説明できるようにしておこうと思います。
今回は結合テストの内容を書きましたが、これさえあればバグを防げる!というわけではないですが、転ばぬ先の杖として非常に有用だと思っています。圧倒的にリファクタがしやすくなるのでおすすめです。
引用とか
おすすめ書籍
今からSpringを始めるならSpring 3がおすすめです。書籍で完全に理解できるかというと違うと思いますが、参考までに。
おすすめな書籍です。良ければ買って下さい!!