Tagbangers Blog

ユニットテストを実装してみる

こんにちは、藤岡です。

今週はユニットテストについて学びました。

ユニットテストとは、プログラムを構成する個々のメソッドが正しく機能しているかを確かめるためのテストのことです。

ユニットテストのメリットは、全体でテストをするよりも細かく分けてテストをした方が、バグの原因がどこにあるのか突き止めやすいことと、テストを意識してプロダクションコードを書くことで結合度を低く保てるため、互いに影響を及ぼしにくくなるところです。

一方で、これは開発者によって実施されるため、開発者にかかる負担が大きくなりやすいというデメリットもあるそうです。


今回僕がやるのは、今まで作ってきたプログラム(catlschatWebサーバ)のユニットテストを実施することです。

これらのプログラムは時間をかけて作ったもので、愛着がわいてしまっているため、単体テストを導入することでさらに良いプログラムにすることができるのは喜ばしいことです。

しかし、実際にテストコードを書こうとしてみると、思いがけない壁に何度もぶち当たってしまいました。

例えば、戻り値のないvoid型のメソッドをどうテストするかという問題です。

何かしら値が変わっていればそこに着目してテストをすれば良いのですが、何かを出力させるだけのものなどはテストの仕様がなく、困り果てていました。

しかし、どうやらMockitoというものを使えば良いのだということがわかりました。

public class Dog {
    public void cry() {
        System.out.println("わん");
    }
}

仮にこのメソッドをテストしたい時には

PrintStream out = mock(PrintStream.class);
System.setOut(out);
Dog dog = new Dog();
dog.cry();
verify(out).println("わん");

とすれば、出力結果が異なった場合にエラーを出してくれるので、正常にテストができます。

また、引数を受け取るメソッドの場合、引数に応じて戻り値を変えるようモックすることもできます。

LinkedList mockedList = mock(LinkedList.class);
when(mockedList.get(0)).thenReturn("first");
System.out.println(mockedList.get(0));

このようにすれば、「first」が出力されます。


以上のように、Mockitoを使えば色々便利なことができるのですが、今回は使うまでもなくテストができるそうなので、なるべく使わずにテストコードを書いていきたいです。

初めにメリットとしても書きましたが、テストコードを書こうとすることで、プロダクションコードの設計があまり良くなかった場合、それに気づくことができ、改善することができます。1から見直さなくてはならなくなるものもあるかもしれませんが、ユニットテストは実務においても重要なものだと思うので、精進したいです。