测试弹簧mvc休息控制器

Jos*_*lle 1 spring spring-mvc spring-test spring-boot

我正在尝试使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

java.lang.AssertionError:期望的状态:<200>但是在org.springframework.test.util.AssertionErrors.assertEquals的org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:60)中是:<404>( 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)at.ancompany.TestUsingWebAppContextSetUp.test(TestUsingWebAppContextSetUp.java:41)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(来自org.junit.runners.model.ReflectiveCallable的org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)的java.lang.reflect.Method.invoke(未知来源)的未知来源.在org.junit.runners.model.FrameworkMethod.invokeExplosively运行(ReflectiveCallable.java:12)(FrameworkMethod.jav)a:47)atg.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)atg.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)org.springframework org.springframework.test.context上的org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)中的.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73) .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)atg.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)at 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)在有机.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)at or.e.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteT)estRunner.java:382)org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

Sot*_*lis 5

的javadoc的MockMvcBuilders.standaloneSetup状态

建立一个MockMvc通过注册一个或多个@Controller情况下,并以编程配置Spring MVC架构.这允许完全控制控制器的实例化和初始化及其依赖性,类似于普通单元测试,同时还可以一次测试一个控制器.

所以你会用它作为

mockMvc = MockMvcBuilders.standaloneSetup(new MyController()).build();
Run Code Online (Sandbox Code Playgroud)

注册一个实际的实例.如果你需要这个是一个Spring托管实例(你可能会考虑它有一个@Autowired字段),你必须从它得到它ApplicationContext.