首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为服务类创建mock并执行测试?

如何为服务类创建mock并执行测试?
EN

Stack Overflow用户
提问于 2017-10-08 07:54:30
回答 2查看 5.2K关注 0票数 0

在尝试测试时,从下面的控制器中删除一个方法会变得很棘手

代码语言:javascript
运行
复制
@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";
}

我的测试开始于下面我的And测试方法中的模拟注入。

代码语言:javascript
运行
复制
@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();
}

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

代码语言:javascript
运行
复制
@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();
 }

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

代码语言:javascript
运行
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2021-01-29 19:10:59

我知道不久前有人问过这个问题,但也许它会对某些人有所帮助:

当我忘记把@RunWith(MockitoJUnitRunner.class)放在我的测试类上面时,我就犯了这个错误。如果你不指定它,那么模拟就不会被创建,你就会试图在未初始化的对象上调用ReflectionTestUtils。

票数 2
EN

Stack Overflow用户

发布于 2017-10-09 10:01:27

对我来说这看起来很好。从我所期望的expect(bookService.removeOne(anyObject( class));).andReturn(book);中的打字错误中分离出来。

你能告诉我们出什么事了吗?异常和堆栈跟踪是什么?另外,我们是否同意通过调用new BookController()来创建bookController

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46626232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档