我正在尝试编写Spring MVC测试来测试Spring控制器。 目前,如果我想测试具有此签名的控制器方法:
@RequestMapping(value = "/new/save", method = RequestMethod.POST)
@Transactional
public String postGateway(@Valid GatewayForm gatewayForm, BindingResult bindingResult, RedirectAttributes flash, Model model)
我会以这种方式使用MockMVC来填充GatewayForm对象参数:
mvc.perform(
post("/new/save")
.sessionAttr("account", account)
.param("serialNumber", "SN1QRTY334V")
.param("branchId", "1")
.param("model", "1")
.param("templateId", "1")
这个问题是我只能使用.param(String,String)方法将String / primitive值设置到GatewayForm对象上。
因此,我无法在上面的GatewayForm上设置对象实例变量。我已经看到其他人发布了该对象的JSON字符串,但这需要更改控制器方法的实现以使用“application / json”,这是我不想做的。
有人可以提供建议吗?
答案 0 :(得分:0)
由于对问题的评论声明字符串本质上是HTTP请求参数的输入,因此目标是将表单对象转换为可接受的字符串。
查看spring-mvc-test-utils library有多种策略可以将对象转换为String。但是,在源代码中将对象转换为String的默认策略是使用:
var validator = _context.Resolve(typeof(IValidator<>)
.MakeGenericType(new[] { query.GetType() }));
var handler = _context.Resolve(typeof(IQueryHandler<>)
.MakeGenericType(new[] { query.GetType() }));
例如我的用例是将List作为参数传递给我的集成测试。我的控制器接受一个具有属性的对象:
String.valueOf(Object object)
因此,我的集成测试会发布如下参数:
public class MyObjectThatTheControllerExpects {
List<SomeEnum> listOfEnums;
Long id
...
我确信这可能不适合更复杂的课程。然而,对于这个微不足道的案例它是有效的。
希望它有所帮助!