반응형
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!
반응형
'Spring > test' 카테고리의 다른 글
[String Test] MockHttpServletResponse Encoding 설정 (0) | 2021.12.31 |
---|---|
[Spring Rest Docs] Intellij + Kotlin DSL + Rest Docs 설정하기 (0) | 2021.12.29 |