복붙노트

[SPRING] Strut 2.3.1.2 유닛 테스트, getContext ()를 사용하여 NPE와 Spring 코드를 제거하는 법

SPRING

Strut 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. ==============================

    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);
    
  2. 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