如何写JUnit测试用例GET API? [重复]

问题描述 投票:1回答:3

这个问题已经在这里有一个答案:

我有一个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;
}
java unit-testing spring-boot junit
3个回答
0
投票

如果你正在使用Spring框架和嘲讽的测试,那么弹簧测试库包含MockMvcMockMvcRequestBuildersclasses,它可以用来测试任何API。您对GET API,你可以建立在public static MockHttpServletRequestBuilder get(String urlTemplate, Object... uriVars) MockMvcRequestBuilders方法的请求

然后你可以使用public ResultActions perform(RequestBuilder requestBuilder)方法MockMvc击中的服务。


0
投票

调用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());
    }

0
投票

首先你必须注释你的测试与以下注释类:

@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));

    }

}
© www.soinside.com 2019 - 2024. All rights reserved.