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のクラスランナーだと使えなかったりしてる
もぅ、世の中クラスライブラリに依存しないで、全部自前で用意してやるのが
業務では楽に思えて仕方が無いネ。