当结果Object / json包含Long字段类型时,进行单元测试Spring MVC REST控制器

在尝试使用MockMvcResultMatchers从Spring REST服务测试JSON输出时遇到问题,其中返回的对象应包含Long值。

仅当JSON对象中的值大于Integer.MAX_VALUE时,测试才会通过。我觉得这有点奇怪,因为我认为我应该能够测试所有适用值。

我知道,由于JSON不包含类型信息,因此它在反序列化时会对类型进行最佳猜测,但是我希望在MockMvcResultMatchers中执行比较时,有一种方法可以强制类型提取。

完整代码在下面,但测试在:

@Test
public void testGetObjectWithLong() throws Exception {
    Long id = 45l;

    ObjectWithLong objWithLong = new ObjectWithLong(id);

    Mockito.when(service.getObjectWithLong(String.valueOf(id))).thenReturn(objWithLong);

    mockMvc.perform(MockMvcRequestBuilders.get("/Test/" + id))
    .andExpect(MockMvcResultMatchers.status().isOk())
    .andExpect(MockMvcResultMatchers.jsonPath("$longvalue")
        .value(Matchers.isA(Long.class)))
    .andExpect(MockMvcResultMatchers.jsonPath("$longvalue")
        .value(Matchers.equalTo(id)));
}

结果是:

java.lang.AssertionError: JSON path$longvalue
Expected: is an instance of java.lang.Long
   but: <45> is a java.lang.Integer
at org.springframework.test.util.MatcherAssertionErrors.assertThat(MatcherAssertionErrors.java:80)
...

任何有关解决此问题的正确方法的想法或建议,将不胜感激。显然,我可以将Integer.MAX_VALUE添加到测试中的id字段中,但这似乎很脆弱。

提前致谢。

除第三方库外,以下内容应自成体系

import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Service;
import org.springframework.test.web.servlet.MockMvc;
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 org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RunWith(MockitoJUnitRunner.class)
public class TestControllerTest {

    private MockMvc mockMvc;

    @Mock
    private RandomService service;

    @InjectMocks
    private TestController controller = new TestController();

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mockMvc = MockMvcBuilders.standaloneSetup(controller)
            .setMessageConverters(new MappingJackson2HttpMessageConverter())
            .build();
    }

    @Test
    public void testGetObjectWithLong() throws Exception {
        Long id = 45l;

        ObjectWithLong objWithLong = new ObjectWithLong(id);

        Mockito.when(service.getObjectWithLong(String.valueOf(id))).thenReturn(objWithLong);

        mockMvc.perform(MockMvcRequestBuilders.get("/Test/" + id))
        .andExpect(MockMvcResultMatchers.status().isOk())
        .andExpect(MockMvcResultMatchers.jsonPath("$longvalue").value(Matchers.isA(Long.class)))
        .andExpect(MockMvcResultMatchers.jsonPath("$longvalue").value(Matchers.equalTo(id)));
    }

    @RestController
    @RequestMapping(value = "/Test")
    private class TestController {

        @Autowired
        private RandomService service;

        @RequestMapping(value = "/{id}", method = RequestMethod.GET)
        public ObjectWithLong getObjectWithLong(@PathVariable final String id) {
            return service.getObjectWithLong(id);
        }
    }

    @Service
    private class RandomService {
        public ObjectWithLong getObjectWithLong(String id) {
            return new ObjectWithLong(Long.valueOf(id));
        }
    }

    private class ObjectWithLong {

        private Long longvalue;

        public ObjectWithLong(final Long theValue) {
            this.longvalue = theValue;
        }

        public Long getLongvalue() {
            return longvalue;
        }

        public void setLongvalue(Long longvalue) {
            this.longvalue = longvalue;
        }
    }
}
主从

您可以将anyOf Matcher与针对Number超类的Class匹配一起使用,并将其设置为

.andExpect(MockMvcResultMatchers.jsonPath("$longvalue")
        .value(Matchers.isA(Number.class)))
.andExpect(MockMvcResultMatchers.jsonPath("$longvalue")
        .value(Matchers.anyOf(
            Matchers.equalTo((Number) id),
            Matchers.equalTo((Number) id.intValue()))));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

测试Spring MVC REST控制器

来自分类Dev

JSON数据到MVC控制器的动作结果

来自分类Dev

对MVC控制器进行单元测试

来自分类Dev

Spring MVC Rest控制器未调用

来自分类Dev

返回PagedResources的单元测试Spring MVC控制器

来自分类Dev

Spring MVC控制器测试-打印结果JSON字符串

来自分类Dev

使用spring-test-mvc进行的弹簧控制器单元测试失败

来自分类Dev

MVC4控制器单元测试

来自分类Dev

MVC4控制器单元测试

来自分类Dev

MVC控制器单元测试编写

来自分类Dev

Spring MVC控制器等效的Javaee控制器

来自分类Dev

Spring MVC REST控制器方法中如何动态选择输出参数类型

来自分类Dev

什么测试足以对MVC中的“创建”控制器方法进行单元测试?

来自分类Dev

Spring MVC:使用MockMultipartFIle和其他表单数据对控制器进行单元测试

来自分类Dev

ASP.NET MVC5:对具有会话的控制器进行单元测试

来自分类Dev

如何对返回匿名对象的ASP.NET Core MVC控制器进行单元测试?

来自分类Dev

使用Moq对MVC6中的控制器路由功能进行单元测试

来自分类Dev

如何对返回匿名对象的ASP.NET Core MVC控制器进行单元测试?

来自分类Dev

Spring MVC Rest Services-线程数(控制器实例)

来自分类Dev

使用TryUpdateModel时的asp.net核心MVC控制器单元测试

来自分类Dev

Spring MVC默认控制器

来自分类Dev

Spring MVC控制器未应用

来自分类Dev

JSP到Spring MVC控制器

来自分类Dev

Spring MVC控制器称为Twice

来自分类Dev

Spring MVC找不到控制器

来自分类Dev

使用整数值作为@RequestParam的spring mvc控制器的单元测试

来自分类Dev

从MVC控制器获取JSON对象

来自分类Dev

MVC 控制器返回 JSON

来自分类Dev

MVC 控制器操作 JSON

Related 相关文章

热门标签

归档