Loading...
Spring Framework Reference Documentation 7.0.2의 Testing Request- and Session-scoped Beans의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Spring은 초기 시절부터 Request- and session-scoped beans을 지원해 왔으며, 다음 단계를 따르면 request-scoped 및 session-scoped 빈을 테스트할 수 있습니다:
@WebAppConfiguration을 어노테이션으로 지정하여 테스트를 위해 WebApplicationContext가 로드되도록 합니다.WebApplicationContext에서 (의존성 주입을 통해) 가져온 웹 컴포넌트를 호출합니다.다음 코드 스니펫은 로그인 유스 케이스에 대한 XML 설정을 보여 줍니다. userService 빈이 request-scoped loginAction 빈에 대한 의존성을 가진다는 점에 유의하십시오. 또한, LoginAction은 현재 HTTP 요청에서 username과 password를 가져오는 SpEL expressions을 사용하여 인스턴스화됩니다.
우리의 테스트에서는 TestContext 프레임워크에 의해 관리되는 목을 통해 이러한 요청 매개변수를 설정하기를 원합니다. 다음 예시는 이 유스 케이스에 대한 설정을 보여 줍니다:
1<beans> 2 3 <bean id="userService" class="com.example.SimpleUserService" 4 c:loginAction-ref="loginAction"/> 5 6 <bean id="loginAction" class="com.example.LoginAction" 7 c:username="#{request.getParameter('user')}" 8 c:password="#{request.getParameter('pswd')}" 9 scope="request"> 10 <aop:scoped-proxy/> 11 </bean> 12 13</beans>
RequestScopedBeanTests에서 우리는 UserService(즉, 테스트의 대상)와 MockHttpServletRequest를 모두 테스트 인스턴스에 주입합니다. requestScope() 테스트 메서드 내에서 제공된 MockHttpServletRequest에 요청 매개변수를 설정하여 테스트 픽스처를 설정합니다.
userService에서 loginUser() 메서드가 호출되면, user service가 현재 MockHttpServletRequest에 대한 request-scoped loginAction에 접근할 수 있다는 것이 보장됩니다(즉, 방금 매개변수를 설정한 그 요청). 그런 다음 username과 password에 대한 알려진 입력값을 기반으로 결과에 대해 어설션을 수행할 수 있습니다. 다음 예시는 그 방법을 보여 줍니다:
1@SpringJUnitWebConfig 2class RequestScopedBeanTests { 3 4 @Autowired UserService userService; 5 @Autowired MockHttpServletRequest request; 6 7 @Test 8 void requestScope() { 9 request.setParameter("user", "enigma"); 10 request.setParameter("pswd", "$pr!ng"); 11 12 LoginResults results = userService.loginUser(); 13 // assert results 14 } 15}
1@SpringJUnitWebConfig 2class RequestScopedBeanTests { 3 4 @Autowired lateinit var userService: UserService 5 @Autowired lateinit var request: MockHttpServletRequest 6 7 @Test 8 fun requestScope() { 9 request.setParameter("user", "enigma") 10 request.setParameter("pswd", "$pr!ng") 11 12 val results = userService.loginUser() 13 // assert results 14 }
다음 코드 스니펫은 request-scoped 빈에 대해 앞에서 본 것과 유사합니다. 그러나 이번에는 userService 빈이 session-scoped userPreferences 빈에 대한 의존성을 가집니다. UserPreferences 빈은 현재 HTTP 세션에서 속성을 가져오는 SpEL expression을 사용하여 인스턴스화된다는 점에 유의하십시오.
1<beans> 2 3 <bean id="userService" class="com.example.SimpleUserService" 4 c:userPreferences-ref="userPreferences" /> 5 6 <bean id="userPreferences" class="com.example.UserPreferences" 7 c:theme="#{session.getAttribute('theme')}" 8 scope="session"> 9 <aop:scoped-proxy/> 10 </bean> 11 12</beans>
SessionScopedBeanTests에서 우리는 UserService와 MockHttpSession을 테스트 인스턴스에 주입합니다. sessionScope() 테스트 메서드 내에서 제공된 MockHttpSession에 예상되는 theme 속성을 설정하여 테스트 픽스처를 설정합니다.
userService에서 processUserPreferences() 메서드가 호출되면, user service가 현재 MockHttpSession에 대한 session-scoped userPreferences에 접근할 수 있다는 것이 보장되며, 설정된 theme을 기반으로 결과에 대해 어설션을 수행할 수 있습니다. 다음 예시는 그 방법을 보여 줍니다:
1@SpringJUnitWebConfig 2class SessionScopedBeanTests { 3 4 @Autowired UserService userService; 5 @Autowired MockHttpSession session; 6 7 @Test 8 void sessionScope() throws Exception { 9 session.setAttribute("theme", "blue"); 10 11 Results results = userService.processUserPreferences(); 12 // assert results 13 } 14}
1@SpringJUnitWebConfig 2class SessionScopedBeanTests { 3 4 @Autowired lateinit var userService: UserService 5 @Autowired lateinit var session: MockHttpSession 6 7 @Test 8 fun sessionScope() { 9 session.setAttribute("theme", "blue") 10 11 val results = userService.processUserPreferences() 12 // assert results 13 }
Bean Overriding in Tests
Transaction Management