1

私のStruts2アクションクラスは、以下のコードを使用してセッションに正常にアクセスします

    ActionContext.getContext().getSession().clear();

ただし、Junit を使用して Action クラスをテストしようとすると、NullPointer 例外が発生します。
StackOverflow で他の人が投稿したコメントのいくつかを確認しており、以下のコードを使用しています。

HttpServletRequest request;

HttpSession session;

@Before
public void setUp() throws Exception {        

    request = Mockito.mock(HttpServletRequest.class);
    request.setAttribute("beanList", beanList);
    request = Mockito.mock(HttpServletRequest.class);
    Mockito.when(request.getSession()).thenReturn(session);

    Map<String, Object> contextMap = new HashMap<String, Object>();
    contextMap.put(StrutsStatics.HTTP_REQUEST, request);
    ActionContext.setContext(new ActionContext(contextMap));
}

ただし、それでもヌル ポインター エラーがスローされます。システムはコンテキストを正常に取得できますが、セッションを取得しようとすると停止します。また、同じ目標を達成するためにいくつかの異なる方法を試しましたが、役に立ちませんでした。私が間違っていることは何ですか?

4

2 に答える 2

4

セッションのインスタンス化またはモック化についてはどうですか?

session = mock(HttpSession.class);

電話する前に

Mockito.when(request.getSession()).thenReturn(session);

于 2013-09-03T22:36:08.280 に答える
2

依存性注入アプローチを使用して、アクションを実装に変更しますSessionAware。次に、Struts2 フレームワークは、以下の例のように、セッションをアクションに挿入します。最後に、マップをアクションに挿入するだけでテストできます。

public class MyAction extends ActionSupport implements SessionAware {
  private Map<String, Object> session;

  public String execute() {
    // do actiony stuff
    return SUCCESS;
  }

  public void setSession(Map<String, Object> session) {
    this.session = session;
  }
}

参考までに、このインジェクションの実行を処理し、やServletConfigInterceptorなどの他のサーブレット オブジェクトにアクセスするために同じ種類のインジェクションを使用できます。HttpServletRequestServletContext

于 2013-09-04T03:01:10.907 に答える