nologyance.net

日々のアウトプット

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していた部分がモック化されてテストが出来るようになるはず。