如何解决如何在Spring MVC项目中使用MockMvc测试@ModelAttribute?
我有一个针对@ModelAttribute的糟糕测试解决方案的简单示例。它很脏而且很粗糙,无法正确执行Spring内置的编组逻辑(我使用的是Spring 4.3)。但这给了我一些测试范围。这是设置...
我的控制器
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import lombok.Data;
@Controller
public class TestController {
@Data
public static class Attribute {
private String value;
public Attribute() {
System.out.println("Creating Attribute with Hash " + System.identityHashCode(this));
}
}
@RequestMapping(value = "/test",method = RequestMethod.POST)
@ResponseBody
public String execute(@ModelAttribute Attribute attributeName) {
System.out.println("Got Attribute: " + attributeName + ". Hash " + System.identityHashCode(attributeName));
return attributeName.getValue();
}
}
此类旨在服务于来自Web表单的POST请求。当我查看HTTP POST请求的正文时,它们看起来像这样:
发布参数
-----------------------------146210025630598007628905704
Content-Disposition: form-data; name="feed"; filename="littleFile.txt"
Content-Type: text/plain
littleFile.txt
-----------------------------146210025630598007628905704
Content-Disposition: form-data; name="value"
some value
-----------------------------146210025630598007628905704
以上内容是对我的表单真正产生的内容的一种破解,并且我还没有针对正在运行的服务器进行过测试。重要说明:有一个字段被推送到我的Attributes bean中,并且有一个文件正在上传。
现在,我正在尝试编写一个测试来验证我的Spring批注(@RequestMapping和@ModelAttribute)的行为。我正在使用MockMvc进行此操作。我的基本测试只是看我是否可以指定一个属性然后断言它是作为主体传递回控制器的:
我的单元测试
import org.junit.Test;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.support.FormattingConversionService;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import TestController.Attribute;
import lombok.RequiredArgsConstructor;
public class TestControllerTest {
private final TestController toTest = new TestController();
@RequiredArgsConstructor
public static class TestConverter implements Converter<String,Attribute>{
private final Attribute result;
@Override
public Attribute convert(String source) {
System.out.println("Converting: " + source);
return result;
}
}
@Test
public void testAttributeInjection() throws Exception {
Attribute uploadedAttribute = new Attribute();
uploadedAttribute.setValue("I love Spring MVC!");
FormattingConversionService conversionService = new FormattingConversionService();
conversionService.addConverter(new TestConverter(uploadedAttribute));
MockMvc testInterface = MockMvcBuilders.standaloneSetup(toTest)
.setConversionService(conversionService)
.build();
MockHttpServletRequestBuilder request = MockMvcRequestBuilders.post("/test")
.param("attribute","Some String Encoding of Attribute");
testInterface.perform(request)
.andExpect(MockMvcResultMatchers.status().is(200))
.andExpect(MockMvcResultMatchers.content().string("I love Spring MVC!"))
.andReturn();
}
}
测试中的控制台输出
Creating Attribute with Hash 48914743
Converting: Some String Encoding of Attribute
Got Attribute: TestController.Attribute(value=I love Spring MVC!). Hash 48914743
我对ConversionService的使用是黑客。我正在解决一个事实,即我不知道如何正确设置我的请求,这样正常的Spring编组将创建一个Attribute,然后将其值自然地推入Attribute。
我认为我的控制器没有任何问题(它已经在生产中并且正在提供流量)。 如何在不完全跳过Spring编组逻辑的情况下测试@ModelAttribute?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。