簡體   English   中英

Spring 3.2:@Scope(“請求”)的單元測試不再有效

[英]Spring 3.2: Unit testing of @Scope(“request”) no longer works

在Spring 3.1中,我可以將具有`@Scope(“request”)的Jax-RS資源自動裝入我的單元測試中,前提是我包含以下BeanFactoryPostProcessor:

@Component
public class MockRequestBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

public void postProcessBeanFactory(
        ConfigurableListableBeanFactory beanFactory) throws BeansException {

    beanFactory.registerScope("request", new RequestScope());
    MockHttpServletRequest request = new MockHttpServletRequest();
    ServletRequestAttributes attributes = new ServletRequestAttributes(request);
    RequestContextHolder.setRequestAttributes(attributes);
}

}

使用Spring 3.2,第一個運行的測試方法可行,但所有后續測試方法都可以實現

java.lang.IllegalStateException:找不到線程綁定請求:您是指實際Web請求之外的請求屬性,還是處理最初接收線程之外的請求? 如果您實際在Web請求中操作並仍然收到此消息,則您的代碼可能在DispatcherServlet / DispatcherPortlet之外運行:在這種情況下,請使用RequestContextListener或RequestContextFilter來公開當前請求。

我怎樣才能讓我的測試再次運行?

BeanFactoryPostProcessor存在缺陷,它只運行一次,因此只有一個線程將具有(不可重用) MockHttpServletRequest

移動它創建請求,並將其存儲在所述代碼RequestContextHolder應該被移動到一個@Before注釋的方法和在@After注解的方法,你應該清理RequestContextHolder

@Before
public void init() {
    MockHttpServletRequest request = new MockHttpServletRequest();
    ServletRequestAttributes attributes = new ServletRequestAttributes(request);
    RequestContextHolder.setRequestAttributes(attributes);
}

@After
public void cleanUp() {
    RequestContextHolder.resetRequestAttributes();
}

您仍然需要BeanFactoryPostProcessor來注冊RequestScope

Spring 3.2引入了ServletTestExecutionListener ,它粗暴地將自己注入到舊的測試中。

它的javadoc:

TestExecutionListener,它為Spring TestContext Framework加載的WebApplicationContexts提供模擬Servlet API支持。

具體來說,ServletTestExecutionListener在測試實例准備期間和每個測試方法之前通過Spring Web的RequestContextHolder設置線程本地狀態,並基於WebApplicationContext中存在的MockServletContext創建MockHttpServletRequest,MockHttpServletResponse和ServletWebRequest。 此偵聽器還確保可以將MockHttpServletResponse和ServletWebRequest注入到測試實例中,並且一旦測試完成,此偵聽器就會清除線程本地狀態。

請注意,默認情況下啟用ServletTestExecutionListener,但如果為當前測試加載的ApplicationContext不是WebApplicationContext,則不執行任何操作。

問題是最后一段是謊言。 沒錯,除非您進行配置更改,否則此類不會開始幫助您,但無論如何,它都會在每次測試后愉快地重置請求。

可以通過將@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class })到測試類來禁用偵聽器。 (您可能需要根據需要編輯的實際偵聽器集。)

或者,您可以設置@WebAppConfiguration並刪除MockRequestBeanFactoryPostProcessor以及其他遺留解決方法,如MockServletContextAwareProcessor。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM