java - Spring 网络流程 : setting request parameter for JUnit test

标签 java spring mocking junit4 spring-webflow-2

介绍

我有一个 Java/Tomcat/Spring 2.5/Spring Webflow 2.0.9 Web 应用程序。为了测试一些页面,我创建了 JUnit 测试,它为表单对象设置值并模拟来自浏览器的请求。 JUnit 测试类看起来像这样:

@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class })
@ContextConfiguration(locations = { "classpath:/WebTests-context.xml", "classpath:/messageSourceConfig.xml" })
@RunWith(SpringJUnit4ClassRunner.class)

public class InitechValidatorTests {

    protected MockHttpSession session;
    protected MockHttpServletRequest request;

    //test methods omitted

    protected void startSession() {
        session = new MockHttpSession();
    }

    protected void endSession() {
        session.clearAttributes();
        session = null;
    }

    protected void startRequest() {
        request = new MockHttpServletRequest();
        request.setSession(session);
        RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));

        MockRequestContext mrc = new MockRequestContext();
        org.springframework.webflow.execution.RequestContextHolder.setRequestContext(mrc);

        MessageContext messageContext = org.springframework.webflow.execution.RequestContextHolder.getRequestContext()
                .getMessageContext();
        this.validationContext.setMessageContext(messageContext);
    }

    protected void endRequest() {
        ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).requestCompleted();
        RequestContextHolder.resetRequestAttributes();
        request = null;

        org.springframework.webflow.execution.RequestContextHolder.setRequestContext(null);
    }
}

对于每个测试方法,我调用 startRequest 和 endRequest 方法(在第一个测试方法之前调用 startSession,在最后一个测试方法之后调用 endSession)。没有这个结构我不能使用例如我正在测试的代码中的 RequestContextHolder。

问题

在要测试的类中,我从网络流中读取请求参数的内容,如下所示:

RequestContext requestContext = RequestContextHolder.getRequestContext();
ExternalContext externalContext = requestContext.getExternalContext();
String printPressed = externalContext.getRequestParameterMap().get("printPressed");

我需要像这样在我的 JUnit 测试方法中设置“printPressed”请求参数:

org.springframework.webflow.execution.RequestContext requestContext = org.springframework.webflow.execution.RequestContextHolder
                    .getRequestContext();
ExternalContext externalContext = requestContext.getExternalContext();
Map requestParamMap = externalContext.getRequestParameterMap().asMap();
requestParamMap.put("printPressed", "true");

这是不可能的,因为映射是不可变的并且会导致 UnsupportedOperationException。

问题是:如何给类org.springframework.webflow.context.ExternalContext中的requestParameterMap设置一个请求参数? getRequestParameterMap返回的参数映射是不可变的,所以我不能在那里添加参数。我注意到有例如一个对象 MockParameterMap ,这听起来很有希望:“允许参数突变的参数映射的扩展。可用作测试 stub 。”

如何将 MockParameterMap 注入(inject)到测试类中的 ExternalContext?或者有没有其他方法可以设置单元测试的请求参数?

最佳答案

通过修改 startRequest 方法解决了这个问题,我设置了 MockParameterMap到一个新的MockExternalContext对象,设置为 MockRequestContext以下:

MockParameterMap mpp = new MockParameterMap();
MockExternalContext mec = new MockExternalContext(mpp);
mrc.setExternalContext(mec);

然后在JUnit测试方法中我可以设置如下参数:

org.springframework.webflow.execution.RequestContext requestContext = org.springframework.webflow.execution.RequestContextHolder
                    .getRequestContext();
ExternalContext externalContext = requestContext.getExternalContext();
MockParameterMap requestParameterMap = (MockParameterMap) externalContext.getRequestParameterMap();
requestParameterMap.put("printPressed", "true");

关于java - Spring 网络流程 : setting request parameter for JUnit test,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10600749/

相关文章:

java - 使用 javax.sql.Datasource 并在 Websphere 上托管应用程序时出现 IllegalArgumentException

python - 模拟 ReadTheDocs 的子模块

java - 反序列化从服务器返回的 JSON(包含 HashMap)

java - JSON Volley 嵌套 JSON 数组 com.android.volley.ParseError : org. json.JSONException

java - 如何撤消 java 中的启动画面绘制

java - 从 URL 获取数据时 PKIX 路径构建失败

java - Windows 10 不支持请求方法 'HEAD'

JavaFX : Integrating Spring framework with JavaFX app(Incorrect configuration)

c# - 使用起订量,如何在另一个方法的回调中更改一个方法的设置?

mocking - PHPUnit:将模拟对象作为方法参数传递