SpringBootの@SpringBootTestとは?
org.springframework.boot.test.context.SpringBootTest
@SpringBootTestがないとどうなるか?
// @SpringBootTest
public class LoginServiceImplTest {
@Autowired
private LoginServiceImpl loginServiceImpl;
/**
* テスト条件:XXX
* 期待値:YYY
*/
@Test
public void login1() {
String login = loginServiceImpl.login("foo", "bar");
Assertions.assertEquals(login, "expected");
}
}
@SpringBootTestをコメントアウトした状態で実行すると。。。
12月 23, 2021 9:47:33 午前 org.junit.platform.launcher.core.EngineDiscoveryOrchestrator lambda$logTestDescriptorExclusionReasons$7
情報: 0 containers and 1 tests were Method or class mismatch
Cannot invoke "com.springhack.help.service.LoginServiceImpl.login(String, String)" because "this.loginServiceImpl" is null
java.lang.NullPointerException: Cannot invoke "com.springhack.help.service.LoginServiceImpl.login(String, String)" because "this.loginServiceImpl" is null
at com.springhack.help.service.LoginServiceImplTest.login1(LoginServiceImplTest.java:21)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
このようなエラーとなります。
loginServiceImplが@AutowiredによってDIされていないため、13行目でNullPointerExceptionが発生しています。
このように、@SpringBootTestアノテーションは、@ServiceなどがついたクラスをbootRunした時のようにインスタンス化してDIするために必要なのです。