2017-10-07 79 views
0

它当它到达方法从我的控制器中删除一个得到棘手试图测试我如何处理为服务类创建模拟并执行测试?

@RequestMapping(value="/remove", method=RequestMethod.POST) 
public String remove(
     @ModelAttribute("id") String id, Model model 
) { 
    bookService.removeOne(Long.parseLong(id.substring(8))); 
    List<Book> bookList = bookService.findAll(); 
    model.addAttribute("bookList", bookList); 

    return "redirect:/book/bookList"; 
} 

时的下方,我的测试与模拟注射开始在我之前的测试方法如下

@Before 
public void setUp() { 
    bookService = createMock(BookService.class); 

    ReflectionTestUtils.setField(bookController, "bookService", bookService); 

    userRepository= createMock(UserRepository.class); 
    ReflectionTestUtils.setField(bookController, "userRepository", userRepository); 

    mockMvc = standaloneSetup(bookController) 
      .setMessageConverters(new MappingJackson2HttpMessageConverter()) 
      .build(); 
} 

最后的测试,试图删除一本书,而不是写它。我该如何继续?

@Test 
public void bookRemoveTest() throws Exception { 
    securityService.autologin("admin", "admin"); 

    Book book = new Book(); 
    book.setId(1L); 

    expect(bookService.removeOne(anyObject(class));).andReturn(book); 

    replay(bookService); 

    MvcResult result = mockMvc 
      .perform(post("/book/remove") 
        .accept(MediaType.TEXT_HTML) 
        .contentType(MediaType.TEXT_HTML)) 
      .andExpect(status().isOk()) 
      .andReturn(); 
    String controllerResult = result.getResponse().getContentAsString(); 
} 

哪里出了问题,我该如何使这个测试工作?

java.lang.IllegalArgumentException: Either targetObject or targetClass for the field must be specified 

    at org.springframework.util.Assert.isTrue(Assert.java:68) 
    at org.springframework.test.util.ReflectionTestUtils.setField(ReflectionTestUtils.java:164) 
    at org.springframework.test.util.ReflectionTestUtils.setField(ReflectionTestUtils.java:100) 
    at org.springframework.test.util.ReflectionTestUtils.setField(ReflectionTestUtils.java:84) 
    at com.admintest.controller.BookControllerTest.setUp1(BookControllerTest.java:62) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at 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.RunBefores.evaluate(RunBefores.java:24) 
+0

这里是什么错@Stephen – valik

+0

已更新现在检查 – valik

回答

0

这对我来说很好。公寓从我预计会在expect(bookService.removeOne(anyObject(class));).andReturn(book);打字错误。

您能告诉我们什么是错的吗?什么是异常和堆栈跟踪?另外,我们是否同意通过拨打new BookController()创建bookController

+0

更新错误检查@henri – valik

+0

这意味着您的'bookController'在使用'ReflectionTestUtils.setField'之前未被初始化。所以它是空的 – Henri