文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

seasarのユニットテストでTransactionTokenのチェック処理をスルーする

フォームがある画面の場合、URL直打ちによるアクセスや2重submit等を防ぐためにtokenチェックを入れるのが定番ですね。しかしこのtokenチェック、普通にやるとJUnitのユニットテストで必ずひっかかってしまいます。なんせ前の画面から遷移していませんからね。今回はS2JUnit4を使ってtokenチェックをスルーする方法を紹介します。


f:id:treeapps:20180418115102p:plain

早速サンプルです。今回はseasar依存のユニットテストとなっています。

import org.apache.struts.Globals;
import org.apache.struts.taglib.html.Constants;
import org.apache.struts.util.TokenProcessor;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.seasar.framework.mock.servlet.MockHttpServletRequest;
import org.seasar.framework.unit.Seasar2;

@RunWith(Seasar2.class)
public class TokenTest {

    private MockHttpServletRequest req;

    @Test
    public void トークンチェックを突破するテスト() {
        // 前の画面からtokenパラメータが渡された事にする
        String token = "偽物のトークン値";
        req.addParameter(Constants.TOKEN_KEY, token);
        // パラメータをセッションに保存
        req.getSession().setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);

        // tokenチェックを突破する
        if (!TokenProcessor.getInstance().isTokenValid(req, true))
            Assert.fail("tokenチェックにひっかかりました");
    }
}

MockHttpServletRequestというリクエストをごにょごにょいじれてしまうオブジェクトを使い、前の画面からトークンパラメータが渡され、更にそのトークン値をセッションに保存しておき、isTokenValid()のチェックをスルーしています。

tokenチェックは前の画面で行ったsaveToken()でセッションに保存されたtoken値と、submitイベントで渡されたhiddenのtoken値が同じかどうかを見ているだけなので、token値がパラメータが渡され、セッションにそのtoken値が入っていれば、isTokenValid()を突破できます。詳しくは org.apache.struts.util.TokenProcessorクラスを見るといいでしょう。ソースが200行くらいしかないので、見ると簡単に理解できます。

Javaエンジニア養成読本[現場で役立つ最新知識、満載!]

Javaエンジニア養成読本[現場で役立つ最新知識、満載!]

JavaScriptエンジニア養成読本[Webアプリ開発の定番構成Backbone.js+CoffeeScript+Gruntを1冊で習得!]

JavaScriptエンジニア養成読本[Webアプリ開発の定番構成Backbone.js+CoffeeScript+Gruntを1冊で習得!]