使用 Junit 和 Mockito 的 Rest API 的 Junit 测试用例

维沙尔库马尔

API 的 Junit 测试用例我是 Junit 和 Mockito 的新手,正在尝试为我的控制器类编写单元测试用例来测试我的 API。这是控制器类

package com.mylearnings.controller;

import com.mylearnings.modal.Product;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

@RestController
public class ProductController {

    private HashMap<String, Product> productCatalog = new HashMap<>();

    @PostMapping("/product")
    public ResponseEntity addProduct(@RequestBody Product product) {
        productCatalog.put(product.getId(), product);
        return new ResponseEntity("product added successfully", HttpStatus.CREATED);
    }

    @GetMapping("/product/{id}")
    public ResponseEntity getProductDetails(@PathVariable String id) {
        return ResponseEntity.ok(productCatalog.get(id));
    }

    @GetMapping("/product")
    public List<Product> getProductList() {
        return new ArrayList<>(productCatalog.values());
    }

    @PutMapping("/product")
    public String updateProduct(@RequestBody Product product) {
        productCatalog.put(product.getId(), product);
        return "product updated successfully";
    }

    @DeleteMapping("/product/{id}")
    public String deleteProduct(@PathVariable String id) {
        productCatalog.remove(id);
        return "product deleted successfully";
    }
}

我尝试了以下已添加的 @ExtendWith(MockitoExtension.class) 并尝试了但仍然失败

 package com.mylearnings.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.mylearnings.modal.Product;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.web.context.WebApplicationContext;

import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;

@SpringBootTest
@AutoConfigureMockMvc
public class ProductControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Mock
    private Map<String, Product> productCatalog;

    @InjectMocks
    private ProductController productController;

    @Test
    public void testAddProduct() throws Exception {
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/product").contentType(MediaType.APPLICATION_JSON).content(new ObjectMapper().writeValueAsString(new Product("MS116", "Dell MS116", "Dell MS116 Usb wired optical mouse", "", 229d)))).andReturn();

        assertEquals(201, mvcResult.getResponse().getStatus());
    }

    @Test
    public void testGetProductDetails() throws Exception {
        Product product = new Product("MS116", "Dell MS116", "Dell MS116 Usb wired optical mouse", "", 229d);
        when(productCatalog.get("MS116")).thenReturn(product);
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/product/{id}", "MS116").accept(MediaType.APPLICATION_JSON)).andReturn();

        assertEquals(200, mvcResult.getResponse().getStatus());
        Product result = new ObjectMapper().readValue(mvcResult.getResponse().getContentAsString(), Product.class);
        assertEquals(product, result);
    }
}

测试用例 testGetProductDetails() 失败,我不确定是不是因为地图?

德米特里

为了能够使用 (@Mock@InjectMocks) 将模拟注入应用程序上下文并使其可供您使用MockMvc,您可以尝试在启用MockMvc唯一ProductController实例(您刚刚模拟的那个)的情况下以独立模式初始化。

例子:

package com.mylearnings.controller;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;

import com.mylearnings.controller.Product;
import com.mylearnings.controller.ProductController;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

@ExtendWith(MockitoExtension.class)
public class ProductControllerTest {

    private MockMvc mockMvc;

    @Mock
    private HashMap<String, Product> productCatalog;

    @InjectMocks
    private ProductController productController;

    @BeforeEach
    public void setup() {
        mockMvc = MockMvcBuilders.standaloneSetup(productController)
                .build();
    }

    @Test
    public void testAddProduct() throws Exception {
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/product").contentType(MediaType.APPLICATION_JSON)
                        .content(new ObjectMapper().writeValueAsString(new Product("MS116", "Dell MS116", "Dell MS116 Usb wired optical mouse", "", 229d))))
                .andReturn();

        assertEquals(201, mvcResult.getResponse().getStatus());
    }

    @Test
    public void testGetProductDetails() throws Exception {
        Product product = new Product("MS116", "Dell MS116", "Dell MS116 Usb wired optical mouse", "", 229d);
        when(productCatalog.get("MS116")).thenReturn(product);
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/product/{id}", "MS116").accept(MediaType.APPLICATION_JSON)).andReturn();

        assertEquals(200, mvcResult.getResponse().getStatus());
        Product result = new ObjectMapper().readValue(mvcResult.getResponse().getContentAsString(), Product.class);
        assertEquals(product, result);
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Mockito的JUnit测试用例

使用jUnit和Mockito进行外部REST API调用的单元测试

使用Spring Rest Docs在Junit中测试用例失败

使用Junit和Mockito嵌套异常问题测试POST Api

使用Mockito的JUnit测试用户输入

如何使用junit和mockito测试springjdbcTemplate

在JUnit4和Mockito中编写SQLiteOpenHelper测试用例

Junit 测试用例与 Mockito 和 Spring MVC 一起下降

使用 Kotlin 和 JUnit 5 测试 rest api

如何使用Mockito在Junit测试用例中验证logger.error(String message,Throwable t)

VSTS测试,JUnit和VSTS Rest API

Spring集成框架中ResponseEntity <?>的Junit Mockito测试用例

JUnit测试的InputStreamReader的使用的Mockito

使用Mockito进行JUnit测试

如何编写JUnit测试用例以测试线程和事件

使用preAuthorize注释对通过Jhipster生成的api进行junit测试用例中所需的更改

使用Junit和Mockito测试catch块逻辑

如何使用Junit和Mockito测试Spring验证器

使用和的Mockito到的JUnit测试图像

如何使用JUnit和Mockito测试自定义JsonSerializer

如何使用Junit和Mockito测试DaoImpl方法

如何使用Junit和Mockito测试Sum Double值?

如何使用JUnit和Mockito测试我的JwtAuthentication类?

使用JUnit和Mockito测试方法结果的最佳方法

如何使用JUnit和/或Mockito测试void方法

使用 JUnit 和 Mockito 编写单元测试

如何使用 mockito 和 junit 测试此功能?

使用JUnit +(在Android中为Robolectric或Mockito或两者都包含)的单元测试用例

文件的Junit测试用例