2015-11-06 200 views
0

我想创建一个非常基本的单元测试使用MockMvcBuilders.standaloneSetup方法的弹簧mvc休息控制器。我不断收到404错误。下面我列出我的测试应用程序上下文,我的测试类,我的控制器和完整的堆栈跟踪。任何指导表示赞赏。测试弹簧mvc休息控制器

@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:状态预期:< 200>但:< 404> 在org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:60) 在org.springframework .test.util.AssertionErrors.assertEquals(AssertionErrors.java:89) at org.springframework.test.web.servlet.result.StatusResultMatchers $ 10.match(StatusResultMatchers.java:653) at org.springframework.test.web。 servlet.MockMvc $ 1.andExpect(MockMvc.java:152) at com.mycompany.TestUsingWebAppContextSetUp.test(TestUsingWebAppContextSetUp.java:41) at sun.reflect.NativeMethodAccesso rImpl.invoke0(本机方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(来源不明) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(来源不明) 在java.lang.reflect.Method.invoke(来源不明) 在org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model .FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores .java:26) at org.springframework.test.context.junit4.statements.RunBeforeTes tMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82) at org.springframework.test.context.junit4.statements.SpringRepeat。评价(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) 1 org.junit.runners.ParentRunner $。日程表(ParentRunner.java:71) at org.junit.runners.ParentRunne r.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58) at org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:268) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 在org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68) 的组织。 junit.runners.ParentRunner.run(ParentRunner.java:363) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163) at org.eclipse.jdt.internal.junit4.runner。 JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExec ution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner。 runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main( RemoteTestRunner。Java的:192)

回答

3

MockMvcBuilders.standaloneSetup状态

Build a MockMvc by registering one or more @Controller 's instances and configuring Spring MVC infrastructure programmatically. This allows full control over the instantiation and initialization of controllers, and their dependencies, similar to plain unit tests while also making it possible to test one controller at a time.

的Javadoc所以,你会用它作为

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

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

+0

工作。我现在在那里放了一个可见的封装器,所以我可以注入这个服务。我会尝试在某些时候获取上下文版本。谢谢! –

+0

我想知道为什么他们有一个方法签名需要一个类,如果他们希望你实例化它?方法签名意味着它们实例化并配置它。 –

+0

@JoshChappelle公平地说,该方法的参数类型为Object。由于没有“控制器”超类型,Spring必须接受每个可能用'@ Controller'注释的类型。 –