test: 添加MenuHandler单元测试

- 测试菜单Handler的9个方法
- 覆盖查询、创建、更新、删除、树形结构等功能
- 使用Mockito模拟Service层依赖
- 使用StepVerifier验证响应式流
This commit is contained in:
张翔
2026-03-14 16:33:22 +08:00
parent 55301b78ae
commit 28ed7a8ed0
@@ -0,0 +1,222 @@
package cn.novalon.manage.sys.handler.menu;
import cn.novalon.manage.sys.core.domain.SysMenu;
import cn.novalon.manage.sys.core.service.ISysMenuService;
import cn.novalon.manage.sys.dto.request.MenuCreateRequest;
import cn.novalon.manage.sys.dto.request.MenuUpdateRequest;
import cn.novalon.manage.sys.core.command.CreateMenuCommand;
import cn.novalon.manage.sys.core.command.UpdateMenuCommand;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.http.HttpStatus;
import org.springframework.mock.web.reactive.function.server.MockServerRequest;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import java.time.LocalDateTime;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class MenuHandlerTest {
@Mock
private ISysMenuService menuService;
private MenuHandler menuHandler;
private SysMenu testMenu;
@BeforeEach
void setUp() {
menuHandler = new MenuHandler(menuService);
testMenu = new SysMenu();
testMenu.setId(1L);
testMenu.setParentId(0L);
testMenu.setMenuName("系统管理");
testMenu.setMenuType("M");
testMenu.setOrderNum(1);
testMenu.setComponent("system");
testMenu.setPerms("system:manage");
testMenu.setStatus(1);
testMenu.setCreatedAt(LocalDateTime.now());
testMenu.setUpdatedAt(LocalDateTime.now());
}
@Test
void testGetAllMenus() {
when(menuService.findAll()).thenReturn(Flux.just(testMenu));
ServerRequest request = MockServerRequest.builder().build();
Mono<ServerResponse> response = menuHandler.getAllMenus(request);
StepVerifier.create(response)
.expectNextMatches(serverResponse ->
serverResponse.statusCode() == HttpStatus.OK)
.verifyComplete();
verify(menuService).findAll();
}
@Test
void testGetMenuById() {
when(menuService.findById(1L)).thenReturn(Mono.just(testMenu));
ServerRequest request = MockServerRequest.builder()
.pathVariable("id", "1")
.build();
Mono<ServerResponse> response = menuHandler.getMenuById(request);
StepVerifier.create(response)
.expectNextMatches(serverResponse ->
serverResponse.statusCode() == HttpStatus.OK)
.verifyComplete();
verify(menuService).findById(1L);
}
@Test
void testGetMenuById_NotFound() {
when(menuService.findById(999L)).thenReturn(Mono.empty());
ServerRequest request = MockServerRequest.builder()
.pathVariable("id", "999")
.build();
Mono<ServerResponse> response = menuHandler.getMenuById(request);
StepVerifier.create(response)
.expectNextMatches(serverResponse ->
serverResponse.statusCode() == HttpStatus.NOT_FOUND)
.verifyComplete();
verify(menuService).findById(999L);
}
@Test
void testGetMenuTree() {
when(menuService.findAll()).thenReturn(Flux.just(testMenu));
when(menuService.buildMenuTree(any())).thenReturn(Flux.just(testMenu));
ServerRequest request = MockServerRequest.builder().build();
Mono<ServerResponse> response = menuHandler.getMenuTree(request);
StepVerifier.create(response)
.expectNextMatches(serverResponse ->
serverResponse.statusCode() == HttpStatus.OK)
.verifyComplete();
verify(menuService).findAll();
verify(menuService).buildMenuTree(any());
}
@Test
void testGetMenusByParent() {
when(menuService.findByParentId(0L)).thenReturn(Flux.just(testMenu));
ServerRequest request = MockServerRequest.builder()
.queryParam("parentId", "0")
.build();
Mono<ServerResponse> response = menuHandler.getMenusByParent(request);
StepVerifier.create(response)
.expectNextMatches(serverResponse ->
serverResponse.statusCode() == HttpStatus.OK)
.verifyComplete();
verify(menuService).findByParentId(0L);
}
@Test
void testGetMenusByType() {
when(menuService.findAll()).thenReturn(Flux.just(testMenu));
ServerRequest request = MockServerRequest.builder()
.queryParam("menuType", "M")
.build();
Mono<ServerResponse> response = menuHandler.getMenusByType(request);
StepVerifier.create(response)
.expectNextMatches(serverResponse ->
serverResponse.statusCode() == HttpStatus.OK)
.verifyComplete();
verify(menuService).findAll();
}
@Test
void testCreateMenu() {
MenuCreateRequest createRequest = new MenuCreateRequest();
createRequest.setParentId(0L);
createRequest.setMenuName("新菜单");
createRequest.setMenuType("M");
createRequest.setOrderNum(2);
createRequest.setComponent("new_menu");
createRequest.setPerms("new:menu");
createRequest.setStatus(1);
when(menuService.createMenu(any(CreateMenuCommand.class))).thenReturn(Mono.just(testMenu));
ServerRequest request = MockServerRequest.builder()
.body(Mono.just(createRequest));
Mono<ServerResponse> response = menuHandler.createMenu(request);
StepVerifier.create(response)
.expectNextMatches(serverResponse ->
serverResponse.statusCode() == HttpStatus.CREATED)
.verifyComplete();
verify(menuService).createMenu(any(CreateMenuCommand.class));
}
@Test
void testUpdateMenu() {
MenuUpdateRequest updateRequest = new MenuUpdateRequest();
updateRequest.setParentId(0L);
updateRequest.setMenuName("更新菜单");
updateRequest.setMenuType("M");
updateRequest.setOrderNum(3);
updateRequest.setComponent("updated_menu");
updateRequest.setPerms("updated:menu");
updateRequest.setStatus(1);
when(menuService.updateMenu(any(UpdateMenuCommand.class))).thenReturn(Mono.just(testMenu));
ServerRequest request = MockServerRequest.builder()
.pathVariable("id", "1")
.body(Mono.just(updateRequest));
Mono<ServerResponse> response = menuHandler.updateMenu(request);
StepVerifier.create(response)
.expectNextMatches(serverResponse ->
serverResponse.statusCode() == HttpStatus.OK)
.verifyComplete();
verify(menuService).updateMenu(any(UpdateMenuCommand.class));
}
@Test
void testDeleteMenu() {
when(menuService.deleteMenu(1L)).thenReturn(Mono.empty());
ServerRequest request = MockServerRequest.builder()
.pathVariable("id", "1")
.build();
Mono<ServerResponse> response = menuHandler.deleteMenu(request);
StepVerifier.create(response)
.expectNextMatches(serverResponse ->
serverResponse.statusCode() == HttpStatus.NO_CONTENT)
.verifyComplete();
verify(menuService).deleteMenu(1L);
}
}