测试弹簧mvc休息控制器

时间:2015-11-06 22:44:27

标签: spring spring-mvc spring-boot spring-test

我正在尝试使用MockMvcBuilders.standaloneSetup方法为spring mvc rest控制器创建一个非常基本的单元测试。我一直收到404错误。下面我列出我的测试应用程序上下文,我的测试类,我的控制器和完整的堆栈跟踪。任何指导都表示赞赏。

@Configuration
public class TestContext
{
    @Bean
    public Service service()
    {
        return mock(Service.class);
    }
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={TestContext.class})
@WebAppConfiguration
public class TestUsingWebAppContextSetUp
{
    private MockMvc mockMvc;

    @Autowired
    private Service service;

    @Before
    public void setUp()
    {
        mockMvc = MockMvcBuilders.standaloneSetup(MyController.class)
                .build();
    }

    @Test
    public void test() throws Exception
    {
        mockMvc.perform(get("/search?phoneNumber=5551112222"))
            .andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE));
    }
}

public class MyController
{
    @Autowired
    private Service service;

    @RequestMapping("/search")
    public List<SearchResult> search(@RequestParam(value="phoneNumber") String phoneNumber)
    {
        System.out.println("search called");
        Search search = new Search();
        search.setPhoneNumber(phoneNumber);
        return service.search(search);
    }
}

java.lang.AssertionError:期望的状态:&lt; 200&gt;但是:&lt; 404&gt;     在org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:60)     在org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:89)     在org.springframework.test.web.servlet.result.StatusResultMatchers $ 10.match(StatusResultMatchers.java:653)     在org.springframework.test.web.servlet.MockMvc $ 1.andExpect(MockMvc.java:152)     在com.mycompany.TestUsingWebAppContextSetUp.test(TestUsingWebAppContextSetUp.java:41)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)     at java.lang.reflect.Method.invoke(Unknown Source)     在org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)     在org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)     在org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)     在org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)     在org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)     在org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73)     在org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)     在org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:73)     在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)     在org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:217)     在org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83)     在org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:290)     在org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:71)     在org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)     在org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58)     在org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:268)     在org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)     在org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68)     在org.junit.runners.ParentRunner.run(ParentRunner.java:363)     在org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163)     在org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)     在org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)     在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)     在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)     在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)     在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

1 个答案:

答案 0 :(得分:5)

MockMvcBuilders.standaloneSetup州的javadoc

  

通过注册一个或多个MockMvc 实例来构建@Controller,   以编程方式配置Spring MVC基础结构。这允许   完全控制控制器的实例化和初始化,   和它们的依赖关系,类似于普通的单元测试,同时也在制作   可以一次测试一个控制器。

所以你会用它作为

mockMvc = MockMvcBuilders.standaloneSetup(new MyController()).build();

注册实际的实例。如果你需要这个是一个Spring托管实例(你可能认为它有一个@Autowired字段),你必须从ApplicationContext获得它。