gpt4 book ai didi

spring - 如何使用 jmockit 和 spring 的 mockmvc 来测试 Controller

转载 作者:行者123 更新时间:2023-12-01 23:23:09 26 4
gpt4 key购买 nike

我想使用 mockmvc 来测试 Spring 推荐的 Controller 。但是,我还必须使用 jmockit 来模拟依赖项。

问题是 jmockit 不能很好地处理 mockmvc,无论是 standaloneSetup() 还是 webAppContextSetup()

另一个名为 Mockito 的模拟工具很好地解决了这个问题,但它在模拟依赖项方面有很多限制。

所以,任何人有经验或想法,请告诉我。非常感谢。

示例代码如下:

首先是 Mockito 与 Spring 的 MockMvc 单元测试 Controller 。这运行良好。

public class TestControllerTest {

@InjectMocks
private LoginController loginController;

@Mock
private LoginService loginService;

private MockMvc mockMvc;

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

@Test
public void testLogin() throws Exception {

when(loginService.login()).thenReturn(false);

this.mockMvc.perform(get("/login"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(view().name("goodbyeworld"))
.andReturn();
}
}

其次,jmockit如下。不幸的是,loginController 在设置方法中为 null。而且,如果我只是在 @Tested 方法中调用 loginController.xxx() 就可以了。我认为这表明 loginController@Tested 方法之前但在 @Before 方法之后实例化。

public class TestControllerTest2 {
@Tested
private LoginController loginController;

@Injectable
private LoginService loginService;

private MockMvc mockMvc;

@Before
public void setUp() throws Exception {
this.mockMvc = MockMvcBuilders.standaloneSetup(loginController).build();
}

@Test
public void testLogin() throws Exception {

new Expectations() {{
loginService.login(); result = false;
}};

this.mockMvc.perform(get("/login"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(view().name("goodbyeworld"))
.andReturn();
}
}

那么,如何解决这个问题呢? jmockit 的少数 init 方法?有可能吗?

最佳答案

与 Mockito 的 @InjectMocks 不同,JMockit 的 @Tested 字段仅在 之后 执行任何 @Before 方法。发生这种情况是因为在测试方法中支持模拟参数,这在 Mockito 中不存在。可以说,测试字段应该与模拟字段一起尽早设置,因此这可能会在 JMockit 的 future 版本中改变。

无论如何,目前问题的解决方案是:

  1. 不要使用@Tested;相反,在 @Before 方法中手动实例化并注入(inject)被测对象。
  2. 使用@Tested,但避免依赖于测试字段的@Before 方法。在示例测试中,可以通过调用 MockMvc mockMvc() { return MockMvcBuilders... } 方法在每个测试方法中创建 MockMvc 对象。

关于spring - 如何使用 jmockit 和 spring 的 mockmvc 来测试 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27790997/

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