springとかキライだけれども junit しなければ、ならないから

独自のコンテキストローダー作って UnitTestする際に
モックのHttpServletRequestとかHttpSessionとかを使いたいけれども
xmlとか使いたく無かったので

適当にAPIを見ないでソースコードと、メソッド名から発掘したら
型とインスタンスでBindするメソッドを見つけた。

org.springframework.beans.factory.config.ConfigurableListableBeanFactory#registerResolvableDependency

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.test.context.support.GenericXmlContextLoader;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.RequestScope;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.request.SessionScope;

/**
 * テスト用のコンテキストローダー
 * 
 */
public class ExtendedContextLoader extends
        GenericXmlContextLoader
{
    @Override
    protected void customizeBeanFactory(final DefaultListableBeanFactory beanFactory)
    {
        beanFactory.registerScope("request", new RequestScope());
        beanFactory.registerScope("session", new SessionScope());

        final MockHttpServletRequest request = new MockHttpServletRequest();
        final ServletRequestAttributes attributes = new ServletRequestAttributes(request);
        RequestContextHolder.setRequestAttributes(attributes);
        LocaleContextHolder.setLocale(Locale.getDefault());

        beanFactory.registerResolvableDependency(HttpServletRequest.class,
                request);
        beanFactory.registerResolvableDependency(HttpSession.class,
                request.getSession());

        super.customizeBeanFactory(beanFactory);
    }
}


テストクラスには、下記の形でアノテーションでコンテキストローダを指定

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/baseApplicationContext.xml" }, loader = ExtendedContextLoader.class)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)

でも、RunWithで使えるClassRunnerの継承元がJunitの最新verだと
いきなり、違うクラスになっているから、今までのSpringのクラスランナーだと使えなかったりしてる

もぅ、世の中クラスライブラリに依存しないで、全部自前で用意してやるのが
業務では楽に思えて仕方が無いネ。