请针对我的这个controller使用MockMVC进行自动化单元测试完,要求使用参数化测试
时间: 2024-03-22 18:42:12 浏览: 150
好的,下面是一个使用 MockMVC 进行自动化单元测试的例子,并且使用了参数化测试。
```java
@RunWith(Parameterized.class)
@SpringBootTest
@AutoConfigureMockMvc
public class LoginControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@MockBean
private LoginService loginService;
private String username;
private String password;
private String url;
public LoginControllerTest(String username, String password, String url) {
this.username = username;
this.password = password;
this.url = url;
}
@Parameterized.Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{"user1", "password1", "/login"},
{"user2", "password2", "/login"},
{"admin1", "password1", "/loginAdmin"},
{"admin2", "password2", "/loginAdmin"}
});
}
@Test
public void testLogin() throws Exception {
User user = new User();
user.setUsername(username);
user.setPassword(password);
Result expectedResult = new Result();
expectedResult.setCode(200);
expectedResult.setMessage("success");
Mockito.when(loginService.loginIN(user)).thenReturn(expectedResult);
mockMvc.perform(MockMvcRequestBuilders.post(url)
.content(objectMapper.writeValueAsString(user))
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value(expectedResult.getCode()))
.andExpect(jsonPath("$.message").value(expectedResult.getMessage()));
}
@Test
public void testRegistUser() throws Exception {
User user = new User();
user.setUsername(username);
user.setPassword(password);
Result expectedResult = new Result();
expectedResult.setCode(200);
expectedResult.setMessage("success");
Mockito.when(loginService.registUser(user)).thenReturn(expectedResult);
mockMvc.perform(MockMvcRequestBuilders.post("/regist")
.content(objectMapper.writeValueAsString(user))
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value(expectedResult.getCode()))
.andExpect(jsonPath("$.message").value(expectedResult.getMessage()));
}
}
```
在这个例子中,我们使用了 `@AutoConfigureMockMvc` 注解自动配置了 MockMVC,使用了 `@MockBean` 注解来注入 LoginService 的 Mock 对象,使用了参数化测试来遍历不同的数据输入。
在 `testLogin()` 和 `testRegistUser()` 方法中,我们分别测试了登录和注册的接口。我们首先创建了一个 User 对象,并为其设置了用户名和密码,然后创建了一个预期的 Result 对象,并使用 Mockito 的 `when()` 方法来模拟 LoginService 接口的返回值。接着,我们使用 MockMVC 来模拟 HTTP 请求,并将 User 对象作为请求的主体内容,最后使用 `status()` 和 `jsonPath()` 方法来验证 HTTP 响应是否符合预期。
这个例子中 MockMVC 和参数化测试的使用,可以提高测试的效率和可靠性,在你的实际项目中也可以参考这种方式来进行自动化单元测试。
阅读全文