[SPRING] Strut 2.3.1.2 유닛 테스트, getContext ()를 사용하여 NPE와 Spring 코드를 제거하는 법
SPRINGStrut 2.3.1.2 유닛 테스트, getContext ()를 사용하여 NPE와 Spring 코드를 제거하는 법
Struts 2.3.1.2로 업그레이드하고 있으며 JUnit 테스트에 몇 가지 문제가 있습니다.
내 오래된 테스트 코드는 이런 ....
public class HomeActionTest {
@Test
public void testUserNameErrorMessage() throws Exception {
HomeAction action = new HomeAction();
setupMocks(action);
action.execute();
}
}
액션 클래스 실행 메소드에는 코드가 있습니다.
String text = getText(GLOBAL_SELECT);
이것은 호출 이후 LocalizedTextUtil에서 NullPointerExeception이 발생합니다 ...
ActionContext.getContext()
이제 나는 이것을 시도 할 수 있었고 ...
ActionContext.setContext(new ActionContext(new HashMap()));
그렇다면 컨텍스트에서 Valuestack이 null이므로 NullPointerException이 발생합니다. 이러한 문제를 해결하기 위해 계속 노력할 수 있지만 쓸데없는 작업처럼 보입니다. 더 좋은 방법이 있어야합니다!?
잘....
나는 새로운 Struts 2.3.x.x 테스트 문서를 따른다.
내 struts.xml은 봄에 유선이다.
<action name="secure/home" class="homeAction" method="execute">
<result>home.jsp</result>
<result name="input">home.jsp</result>
<result name="error">error.jsp</result>
</action>
내 테스트 클래스
public class HomeActionTest extends StrutsSpringTestCase {
@Test
public void testUserNameErrorMessage() throws Exception {
ActionProxy proxy = getActionProxy("/secure/home");
// setup the session
Map<String, Object> session = new HashMap<String, Object>();
ActionContext actionContext = proxy.getInvocation().getInvocationContext();
actionContext.setSession(session);
HomeAction homeAction = (HomeAction) proxy.getAction();
proxy.execute();
}
}
하지만 이제는 완전히 채워진 스프링 삽입 액션 클래스를 얻는다는 것을 의미합니다! 대부분의 사람들은 "그래!"라고 말할 것입니다. 이 지점에서.
내 문제는 이것이 UNIT 테스트 클래스가 아니라는 것입니다. 이제는 런타임에 유선 방식을 사용하기 때문에 DB 레이어로 호출하는 것이 전부입니다.
그래서 여기 내 질문입니다, 내가 그것에 도착하는 데 걸렸습니다 알아요, 그것은 getText () 같은 메서드 호출에 필요한 리소스에 액세스 할 수있는 Action 클래스를 얻을 수 있습니다,하지만 모든 봄 아니에요 유선?
잠시 동안 내 행동에 setServicexxxx와 일치하는 모든 메소드를 제거하기 위해 재귀 경로로 이동해야한다는 유혹을받습니다. 적어도 테스트를 실행하면 NullPointerException이 발생하지만 서비스를 조롱 할 수는 있습니다.하지만 이는 잘못된 것입니다. 내 테스트가 빠르며 Spring 컨텍스트를 시작하는 데 2 초를 소비하지 않기를 바랍니다.
Struts2.3은 Unit 테스트의 진수를 따르지 않는 Base 테스트 클래스로 어떻게 끝 났습니까?
이것은 Struts 2.0.9 (xwork-2.0.3.jar)에서 모두 훌륭했습니다.
내가 뭘 놓치고 있니?
해결법
-
==============================
1.실제로 단위 테스트를 가능한 한 빨리 유지해야합니다 (그렇지 않으면 TDD 없음). 그래서 당신은 최소한의 struts 셋업을해야한다. (나는 mockito를 사용하고 있으며, 정적 블록에이 코드를 가지고있다.
실제로 단위 테스트를 가능한 한 빨리 유지해야합니다 (그렇지 않으면 TDD 없음). 그래서 당신은 최소한의 struts 셋업을해야한다. (나는 mockito를 사용하고 있으며, 정적 블록에이 코드를 가지고있다.
ActionContext actionContext = mock(ActionContext.class); ServletContext servletContext = mock(ServletContext.class); when(actionContext.getLocale()).thenReturn(Locale.FRENCH); ValueStack valueStack = mock(ValueStack.class); Map<String, Object> context = new HashMap<String,Object>(); Container container = mock(Container.class); XWorkConverter conv = mock(XWorkConverter.class); when(container.getInstance(XWorkConverter.class)).thenReturn(conv); when(conv.convertValue(any(Map.class), any(Object.class), any(Class.class))).thenAnswer(new Answer<Object>() { public Object answer(InvocationOnMock invocation) throws Throwable { log.info(invocation.getArguments()[1].toString()); return "VALUE"; } }); context.put(ActionContext.CONTAINER, container); when(valueStack.getContext()).thenReturn(context); when(actionContext.getValueStack()).thenReturn(valueStack); ServletActionContext.setContext(actionContext); ServletActionContext.setServletContext(servletContext);
from https://stackoverflow.com/questions/10756591/strut-2-3-1-2-unit-test-how-to-remove-spring-codependency-vs-npe-with-getcontex by cc-by-sa and MIT license