gpt4 book ai didi

java - 当方法使用 ObjectMapper.writeValueAsString 时如何使用模拟编写单元测试

转载 作者:太空宇宙 更新时间:2023-11-04 12:04:27 28 4
gpt4 key购买 nike

我有一个 SpringMVC 项目。我想要测试的 FooController 方法是:

@GetMapping("/view/{fooId}")
public String view(@PathVariable String fooId, Model model) throws FooNotFoundException, JsonProcessingException {
Foo foo = fooService.getFoo(fooId);
model.addAttribute("fooId", foo.getId());
model.addAttribute("foo", new ObjectMapper().writeValueAsString(foo));
return "foo/view";
}

我编写的测试是:

public class FooControllerTest {
@Mock
private Foo mockFoo;
@Mock
private FooService mockFooService;
@InjectMocks
private FooController controller;
private MockMvc mockMvc;

@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
}

@Test
public void testView() throws Exception {
String fooId = "fooId";
when(mockFooService.getFoo(fooId)).thenReturn(mockFoo);
when(mockFoo.getId()).thenReturn(fooId);

mockMvc.perform(get("/foo/view/" + fooId))
.andExpect(status().isOk())
.andExpect(model().attribute("fooId", fooId))
.andExpect(model().attributeExists("foo"))
.andExpect(forwardedUrl("foo/view"));
}

}

此测试失败,并显示java.lang.AssertionError:找不到 ModelAndView。当我调试测试时,当我的 mockFoo 被赋予 new ObjectMapper.writeValueAsString() 时,我发现它出错了。所以我认为模拟对象不能被序列化。我该如何解决这个问题,如何让我的测试通过?

<小时/>我已经尝试过什么:

  • 我在 FooController 中注释了 model.addAttribute("foo", new ObjectMapper().writeValueAsString(foo)); 行,这样测试就可以工作了(但不是我希望我的方法工作的方式)!所以现在我知道这就是问题所在。
  • 我在 FooControllerTest 中注释了 .andExpect(model().attributeExists("foo")) 行,它仍然产生了上面的 AssertionError。
  • Google 和 StackOverflowing,但我能找到一些有用的东西。

最佳答案

一位同事建议如下:不要使用 mockFoo,而是创建一个新的 Foo 对象并像这样使用它:

@Test
public void testView() throws Exception {
String fooId = "fooId";
Foo foo = new Foo(fooId);
when(mockFooService.getFoo(fooId)).thenReturn(foo);

mockMvc.perform(get("/foo/view/" + fooId))
.andExpect(status().isOk())
.andExpect(model().attribute("fooId", fooId))
.andExpect(model().attributeExists("foo"))
.andExpect(forwardedUrl("foo/view"));
}

这有效。我一直认为您必须模拟您未测试的每个对象(因此在 Controller 中,您可以模拟除 Controller 本身之外的所有对象)。但因为 Foo 是一个简单的 POJO,所以不需要模拟它。

关于java - 当方法使用 ObjectMapper.writeValueAsString 时如何使用模拟编写单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40548929/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com