外部リソースの絡む(プログラマ)テスト

今月号のCマガジンで,フィンローダ先生がテストファースト絡みの話をネタにされていました.

public final void testSetCurrentDate() {
    Hoge hoge = new Hoge();
    hoge.setCurrentDate();
    assertEquals(new Date(), hoge.getCurrentDate());
}

こんなのってどうよ?って話です.


もちろん上のテストコードだと,2行目と3行目で異なる時刻が返る可能性があるのでマズイです.自分が考えたのは,

  • そもそもHogeクラスの粒度が微妙.(システム)時間のような外部リソースを扱う場合は,その部分をクラス(例えばHogeDate)として分離しておいて,外部リソースを利用するメソッドのユニットテストはモックオブジェクト(HogeDateMockとか)を使用してテストする
  • で,結局HogeDate自体のテストはどうするの?ってことになるわけですが,今回の場合は,new Date()とhoge.getCurrentDate()の差の絶対値がある値(例えば100msとか?)より小さい場合にはOKとする

みたいな感じかな〜?


自分の理解が正しければ,外部リソースの絡む(プログラマ)テストを行う場合にはモックオブジェクトを活用する必要があって,本番オブジェクトとモックオブジェクトの切り替えを容易に行うためにDIコンテナを利用する,ってことかな?
逆に言えば,ここらへんの技術は知ってて当たり前で,活用している組織とそうでない組織の技術格差(品質格差)っていうのが今後出てくるんじゃないかな?と,勝手に予想してみたり.