为Spring Restful Web服务设置MockMVC

为Spring Restful Web服务设置MockMVC,spring,rest,mockito,mockmvc,Spring,Rest,Mockito,Mockmvc,因此,我认为在spring的Mockmvc上测试springmvc控制器没有太多问题,但我通读了spring教程 这里有很多,但我只是想用一个id参数在web服务上做一个简单的GET。控制器如下所示: @RestController @RequestMapping("/demandrest") public class DemandServicesController { @Autowired DemandService demandService; @Reques

因此,我认为在spring的Mockmvc上测试springmvc控制器没有太多问题,但我通读了spring教程 这里有很多,但我只是想用一个id参数在web服务上做一个简单的GET。控制器如下所示:

@RestController
@RequestMapping("/demandrest")
public class DemandServicesController {

    @Autowired
    DemandService demandService;


    @RequestMapping(value = "/demand/{$id}", method = RequestMethod.GET, headers= "Accept-application/jsson")
    public Demand readDemand(@RequestParam(value="id", required=true) String id){
        return demandService.readDemand(new Long(id));
    }
我编写了一个单元测试,它使用org.springframework.test.web.servlet.MockMvc,我尝试模拟(真正的存根)服务调用,并对状态代码进行断言,得到状态代码404。我的测试是这样的

import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.test.web.servlet.MockMvc;

public class DemandServicesControllerTest {

    MockMvc mockMvc;

    @InjectMocks
    DemandServicesController demandServicesController = new DemandServicesController();

    @Mock
    DemandService demandService;

    @Before
    public void setUpUnitTest() throws Exception {
        MockitoAnnotations.initMocks(this);
        this.mockMvc = standaloneSetup(demandServicesController).
                setMessageConverters(new MappingJackson2HttpMessageConverter()).build();
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void testReadDemandState() throws Exception {
        Long id = new Long(99);
    Demand demand = new Demand();
        demand.setDescription("description");
        when(demandService.readDemand(id)).thenReturn(demand );
        this.mockMvc.perform(get("/demandrest/demand/{id}",id.toString()).
                accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
    }

}

在我发表文章之前,我还有几件事要提。所以,看看教程中的例子,我试着选择我只会使用的东西,这样它就不是一个精确的副本。我必须要做的一个大区别是,我怀疑这与pom中测试插件的配置方式有关,我必须实例化控制器,其中示例足够聪明,可以创建实例。另外,这个例子依赖于Gradle进行项目设置,我只是有一个pom文件用于这个项目。我不确定这是否有区别。这似乎是新的东西,但这是一个非常简单的例子。提前感谢您的帮助

您应该从中修复您的请求映射

@RequestMapping(value = "/demand/{$id}", method = RequestMethod.GET, headers= "Accept-application/jsson")

{$id}
应仅为{id},
标题
有打字错误和不正确的语法。也许您应该考虑使用<代码>产品和 > <代码> >而不是<代码>标题>代码> PARAM。 这将修复404状态

@RequestMapping(value = "/demand/{id}", method = RequestMethod.GET, headers= "Accept=application/json")