1

次のようなシングルトンコントローラーがあります

@Controller
class C {
  @Autowire MyObject obj;
  public void doGet() {
    // do something with obj
  }
}

MyObject はフィルター/インターセプターで作成され、HttpServletRequest 属性に配置されます。次に @Configuration で取得します。

@Configuration
class Config {
  @Autowire
  @Bean @Scope("request")
  MyObject provideMyObject(HttpServletRequest req) {
      return req.getAttribute("myObj");
  }
}

メインコードではすべてがうまく機能しますが、テストでは機能しません: 統合テストから実行すると:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/web-application-config_test.xml")
class MyTest {
    @Autowired
    C controller;

    @Test
    void test() {
       // Here I can easily create "new MockHttpServletRequest()"
       // and set MyObject to it, but how to make Spring know about it?
       c.doGet();
    }
}

それは不平を言うNoSuchBeanDefinitionException: No matching bean of type [javax.servlet.http.HttpServletRequest]。(最初は、リクエストスコープがアクティブではないという不満がありましたが、ここで提案されているように SimpleThreadScope で CustomScopeConfigurer を使用して解決しました)。

Spring インジェクションに私の MockHttpServletRequest を知らせる方法は? または直接MyObject?

4

1 に答える 1

1

一時的に回避しましたが、正しいアプローチのように見えます: Config では、代わりreq.getAttribute("myObj")

RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
return (MyObject) requestAttributes.getAttribute("myObj", RequestAttributes.SCOPE_REQUEST);

そのため、HttpServletRequest インスタンスはもう必要ありません。そしてそれをテストに記入してください:

MockHttpServletRequest request = new MockHttpServletRequest();
request.setAttribute("myObj", /* set up MyObject instance */)
RequestContextHolder.setRequestAttributes(new ServletWebRequest(request));
于 2013-07-15T18:01:47.107 に答える