这个问题已经在这里有一个答案:
我有一个GET API,其接受在控制器类不同的参数。据布尔参数,该API将返回不同的结果。我怎么能写JUnit测试用例一样吗?
@CrossOrigin
@RequestMapping(value = "/api/brand/multi-get", method = RequestMethod.GET, consumes =
MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces =
MediaType.APPLICATION_JSON_VALUE)
public ResponseDTO listBrands(@RequestParam(required = false) Integer start,
@RequestParam(required = false) Integer limit,
@RequestParam(required = false) Boolean show_rejected) {
ResponseDTO responseDTO = new ResponseDTO();
System.out.println("------------------");
try {
if (start == null) {
start = 0;
}
if (limit == null) {
limit = 50;
} else if (1 <= limit && limit <= 250) {
if (show_rejected) {
List<Brand> brands = brandService.findAllBrands(start, limit);
if (brands != null && !brands.isEmpty()) {
responseDTO.setData(brands);
responseDTO.setCode(ErrorCode.error_0);
responseDTO.setMessage("Brand list");
return responseDTO;
} else {
responseDTO.setData(new ArrayList<>());
responseDTO.setCode(ErrorCode.error_0);
responseDTO.setMessage("Brand list");
return responseDTO;
}
} else {
Page<Brand> brands = brandService.findAllActiveBrands(start, limit);
if (brands != null && !brands.isEmpty()) {
responseDTO.setData(brands);
responseDTO.setCode(ErrorCode.error_0);
responseDTO.setMessage("Brand list");
return responseDTO;
} else {
responseDTO.setData(new ArrayList<>());
responseDTO.setCode(ErrorCode.error_0);
responseDTO.setMessage("Brand list");
return responseDTO;
}
}
} else {
responseDTO.setCode(ErrorCode.error_1104);
responseDTO.setMessage(ErrorCode.error_msg1104);
return responseDTO;
}
} catch (Exception e) {
e.printStackTrace();
}
return responseDTO;
}
如果你正在使用Spring框架和嘲讽的测试,那么弹簧测试库包含MockMvc
和MockMvcRequestBuilders
classes,它可以用来测试任何API。您对GET API,你可以建立在public static MockHttpServletRequestBuilder get(String urlTemplate, Object... uriVars)
MockMvcRequestBuilders
方法的请求
然后你可以使用public ResultActions perform(RequestBuilder requestBuilder)
方法MockMvc
击中的服务。
调用GET API,并断言为响应细节。
@Test
public void postSimpleBody() throws Exception {
Response response = server.newRequest("/path").request().buildPost(Entity.text("42")).invoke();
assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
}
首先你必须注释你的测试与以下注释类:
@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
如果您有认证地址:
@WithMockUser
自动装配的mockMvc执行请求:
@Autowired
private MockMvc mockMvc;
使用@MockBean
嘲笑服务层:
@MockBean
private BrandService brandService;
和注释与@Test
注释您的测试:
@Test
public void test_listBrands_when_something_do_something() {
}
然后使用Mockito,在嘲笑你的测试覆盖的服务的方法:
List<Brand> mockBrands = new LinkedList<Brand>();
mockBrands.add(new Brand(/*...*/));
Mockito.when(brandService.findAllBrands(0, 25)).thenReturn(mockBrands);
创建使用类org.springframework.test.web.servlet.request.MockMvcRequestBuilders
的requestBuilder:
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/api/brand/multi-get?start={0}&limit={1}&show_rejected={2}", 0, 25, true)
.accept(MediaType.APPLICATION_JSON);
执行请求,并声称使用类org.springframework.test.web.servlet.result.MockMvcResultMatchers
结果:
mockMvc.perform(requestBuilder)
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON));
作为最后一个提示,添加此2个静态导入使你的代码会更短:
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
然后,你可以做get()
,post()
,status()
,content()
等
下面是完整的例子:
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
public class MyApiControllerTests {
@Autowired
private MockMvc mockMvc;
@MockBean
private BrandService brandService;
@Test
public void test_listBrands_when_something_do_something() {
//#region Mocks
List<Brand> mockBrands = new LinkedList<Brand>();
mockBrands.add(new Brand(/*...*/));
Mockito.when(brandService.findAllBrands(0, 25)).thenReturn(mockBrands);
//#endregion
MockHttpServletRequestBuilder requestBuilder = get("/api/brand/multi-get?start={0}&limit={1}&show_rejected={2}", 0, 25, true).accept(MediaType.APPLICATION_JSON);
mockMvc.perform(requestBuilder)
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON));
}
}