SpringBootを使っているプロジェクトでJUnitテストをしたい
SpringBootとJUnitではまった
下記のようなクラスがあったときに
public class Sample { @Autowired private Hoge hoge; public Boolean huga(hoge) { return hoge == 1; } }
@Component public Hoge { }
Sample#hugaのテストをしたい場合に、SampleTest内でHogeクラスをどう扱えば良いのかわからず悩みました。
素直にテストクラス内で@AutowiredするとDIに失敗してしまいます。 ⇒どうやらDI対象とパッケージが違う場合には、デフォルトだとDIの対象から外れてしまう様子。 今回もSampleクラスとSampleTestクラスは別のパッケージに所属していました。
じゃあパッケージを同じにすれば良いじゃない、とはいかないですよねー。
Testクラスは別パッケージにしているプロジェクトが多いのではないでしょうか。 また、明示的にDIのコンフィグファイルに記載を行うという手もあるみたいですが、 せっかくアノテーションで管理しているのに対象クラスが増えるたびにコンフィグが増えることにつながるのでパス。
解決策
①@RunWith(SpringRunner.class)をTestクラスにつける ②@MockをHogeフィールドにつける ③@InjectMockをSampleフィールドにつける
こんな感じ
@RunWith(SpringRunner.class) public class SampleTest { @Mock Hoge hoge; @InjectMock Sample sample; assertTrue(sample.huga(hoge)); }
これでDIしていた部分がモック化されてテストが出来るようになるはず。