Spring/test

[Spring Test][Kotlin] BeforeAll에서 Bean 주입받는 방법

MOMOBOB 2021. 12. 22. 00:05
반응형

Error

 

Spring Security를 이용한 로그인 테스트를 개발할 때, 테스트 데이터를 사전 Insert해야할 경우가 생겼음.

 

아래와 같이 일반적인 방식?으로 DeveloperService를 주입받고  static한 BeforeAll에서 사용하는 것은 당연히 에러가 발생함..

 

@SpringBootTest
@AutoConfigureMockMvc
class AuthControllerTest() {
    @Autowired
    private lateinit var mockMvc: MockMvc
    
    @Autowired
    private lateinit var developerService: DeveloperService

    companion object {
        lateinit var loginUsername: String
        lateinit var loginPassword: String

        lateinit var failLoginUsername: String
        lateinit var failLoginPassword: String

        @BeforeAll
        @JvmStatic
        fun beforeAll() {
            loginUsername = "test@naver.com"
            loginPassword = "aa12345^"

            failLoginUsername = "test@naver.com"
            failLoginPassword = "aa12345^^"

            // 사용자 추가
            developerService.saveDeveloper(
                Developer(
                    id = null,
                    email = "test@naver.com",
                    pwd = "aa12345^",
                    name = "tester",
                    pictureUrl = "testUrl",
                )
            )

        }
    }
}

 

 

반응형

 


원인

 

테스트 클래스에 할당된 변수는 동적 변수로 힙에 할당되고, static 메소드에서 사용하는 변수는 별도의 static영역의 정적변수만 사용할 수 있기 때문이다.

 

그래서 static한 BeforeAll에서 DeveloperService을 사용하기 위해서는 DeveloperService 변수를 static영역에 할당해야하는데 아래와 같이 BeforeAll 메소트의 파라미터에 Bean주입하는 방식으로 해결할 수 있음.

 

@SpringBootTest
@AutoConfigureMockMvc
class AuthControllerTest() {
    @Autowired
    private lateinit var mockMvc: MockMvc

    companion object {

        lateinit var loginUsername: String
        lateinit var loginPassword: String

        lateinit var failLoginUsername: String
        lateinit var failLoginPassword: String

        @BeforeAll
        @JvmStatic
        fun beforeAll(@Autowired developerService: DeveloperService) {
            loginUsername = "test@naver.com"
            loginPassword = "aa12345^"

            failLoginUsername = "test@naver.com"
            failLoginPassword = "aa12345^^"

            // 사용자 추가
            developerService.saveDeveloper(
                Developer(
                    id = null,
                    email = "test@naver.com",
                    pwd = "aa12345^",
                    name = "tester",
                    pictureUrl = "testUrl",
                )
            )

        }
    }
}

 

 


Thank you!

 

 

반응형