SpringBoot——controller单元测试无需启动上下文的方式
引言
本次通过单独类进行单元测试,无需启动上下文。
代码实践
controller源代码
@Slf4j
@RestController
@RequestMapping("/demo")
@Api(value = "DemoController", tags = "Demo管理模块")
public class DemoController implements DemoApi {
/**
* service
*/
@Autowired
private DemoService demoService;
@Override
@ApiOperation(value = "新增", notes = "新增")
@PostMapping("/create")
public Boolean add(@RequestHeader("appCode") String appCode,
@RequestBody DemoDTO demoDTO) {
boolean addFlag = demoService.add(demoDTO);
if (addFlag) {
// 刷新资源
demoService.refreshMap(appCode);
}
return addFlag;
}
@Override
@ApiOperation(value = "修改", notes = "修改")
@PostMapping("/update")
public Boolean update(@RequestHeader("appCode") String appCode,
@RequestBody DemoDTO demoDTO) {
boolean addFlag = demoService.update(demoDTO);
if (addFlag) {
// 刷新资源
demoService.refreshMap(appCode);
}
return addFlag;
}
@Override
@ApiOperation(value = "删除", notes = "删除")
@DeleteMapping("/delById")
public Boolean deleteById(@RequestHeader("appCode") String appCode, @RequestParam Long id) {
boolean deleteFlag = demoService.deleteById(id);
if (deleteFlag) {
// 刷新资源
demoService.refreshMap(appCode);
}
return addFlag;
}
@Override
@ApiOperation(value = "列表", notes = "列表")
@GetMapping("/list")
public List<DemoVO> list() {
return demoService.list();
}
}
controller测试代码
import com.alibaba.fastjson.JSONObject;
import demo.controller.DemoController;
import demo.service.DemoService;
import demo.dto.DemoDTO;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
/**
* @author demo
* @description DemoControllerTest
* @date 2023/1/5
*/
@RunWith(SpringRunner.class)
public class DemoControllerTest {
/**
* mock mvc
*/
private MockMvc mockMvc;
/**
* 注入实例
*/
@InjectMocks
private DemoController demoController;
/**
* service mock
*/
@Mock
private DemoService demoService;
/**
* appCode
*/
private String appCode;
/**
* before设置
*/
@Before
public void setUp() {
//初始化带注解的对象
MockitoAnnotations.openMocks(this);
//构造mockmvc
mockMvc = MockMvcBuilders.standaloneSetup(demoController).build();
//appCode
appCode = "AppCode_test";
}
/**
* 测试testAdd
*/
@Test
public void testAdd() throws Exception {
//构建dto
DemoDTO demoDTO = new DemoDTO();
//setId
demoDTO.setId(-1L);
//setName
demoDTO.setName("test");
//mock service方法
PowerMockito.when(demoService.add(demoDTO)).thenReturn(true);
//构造body
String body = JSONObject.toJSONString(demoDTO);
//执行mockmvc
this.mockMvc.perform(MockMvcRequestBuilders.post("/demo/create")
//传参
.header("appCode", appCode).content(body).contentType(MediaType.APPLICATION_JSON_VALUE))
//mock返回
.andExpect(status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();
}
/**
* 测试testUpdate
*/
@Test
public void testUpdate() throws Exception {
//构建dto
DemoDTO demoDTO = new DemoDTO();
//setId
demoDTO.setId(-1L);
//setName
demoDTO.setName("test");
//mock service方法
PowerMockito.when(demoService.update(demoDTO)).thenReturn(true);
//构造body
String body = JSONObject.toJSONString(demoDTO);
//执行mockmvc
this.mockMvc.perform(MockMvcRequestBuilders.post("/demo/update")
//传参
.header("appCode", appCode).content(body).contentType(MediaType.APPLICATION_JSON_VALUE))
//mock返回
.andExpect(status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();
}
/**
* 测试testDelete
*/
@Test
public void testDelete() throws Exception {
//Id
Long id = 1000L;
//mock service方法
PowerMockito.when(demoService.deleteById(id)).thenReturn(true);
//执行mockmvc 方法一
// this.mockMvc.perform(MockMvcRequestBuilders.delete("/demo/delById?id={id}",id)
// //传参
// .header("appCode", appCode).contentType(MediaType.APPLICATION_JSON_VALUE))
// //mock返回
//.andExpect(status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();
// }
//方法二
this.mockMvc.perform(MockMvcRequestBuilders.delete("/demo/delById")
//传参
.header("appCode", appCode).param("id", "1000").contentType(MediaType.APPLICATION_JSON_VALUE))
//mock返回
.andExpect(status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();
}
/**
* 测试testList
*/
@Test
public void testList() throws Exception {
this.mockMvc.perform(MockMvcRequestBuilders.get("/demo/list")
//传参
.contentType(MediaType.APPLICATION_JSON_VALUE))
//mock返回
.andExpect(status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();
}
烧不死的鸟就是凤凰
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
2022-01-05 IDEA——修改idea64.exe.vmoptions文件解决coding卡顿问题