test: 添加Service层单元测试

- OperationLogServiceTest: 测试操作日志服务
- SysDictDataServiceTest: 测试字典数据服务
- SysMenuServiceTest: 测试菜单服务(含树形结构构建)
- SysExceptionLogServiceTest: 测试异常日志服务(含分页查询)
- SysLoginLogServiceTest: 测试登录日志服务(含分页查询)
- SysDictTypeServiceTest: 测试字典类型服务
- 使用Mockito模拟Repository层依赖
- 使用StepVerifier验证响应式流
- 覆盖CRUD操作和复杂查询场景
This commit is contained in:
张翔
2026-03-14 16:48:23 +08:00
parent fc9169cf6b
commit 3bd684ce2a
6 changed files with 955 additions and 0 deletions
@@ -0,0 +1,112 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.OperationLog;
import cn.novalon.manage.sys.core.repository.IOperationLogRepository;
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 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.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class OperationLogServiceTest {
@Mock
private IOperationLogRepository logRepository;
private OperationLogService operationLogService;
private OperationLog testLog;
@BeforeEach
void setUp() {
operationLogService = new OperationLogService(logRepository);
testLog = new OperationLog();
testLog.setId(1L);
testLog.setUsername("testuser");
testLog.setOperation("test operation");
testLog.setMethod("testMethod");
testLog.setParams("{}");
testLog.setDuration(100L);
testLog.setIp("192.168.1.1");
testLog.setStatus("1");
}
@Test
void testSave() {
when(logRepository.save(any(OperationLog.class))).thenReturn(Mono.just(testLog));
Mono<OperationLog> result = operationLogService.save(testLog);
StepVerifier.create(result)
.expectNextMatches(log ->
log.getId().equals(1L) &&
log.getUsername().equals("testuser") &&
log.getCreatedAt() != null)
.verifyComplete();
verify(logRepository).save(any(OperationLog.class));
}
@Test
void testFindAll() {
when(logRepository.findAll()).thenReturn(Flux.just(testLog));
Flux<OperationLog> result = operationLogService.findAll();
StepVerifier.create(result)
.expectNext(testLog)
.verifyComplete();
verify(logRepository).findAll();
}
@Test
void testFindByUsername() {
when(logRepository.findByUsername("testuser")).thenReturn(Flux.just(testLog));
Flux<OperationLog> result = operationLogService.findByUsername("testuser");
StepVerifier.create(result)
.expectNext(testLog)
.verifyComplete();
verify(logRepository).findByUsername("testuser");
}
@Test
void testCount() {
when(logRepository.count()).thenReturn(Mono.just(100L));
Mono<Long> result = operationLogService.count();
StepVerifier.create(result)
.expectNext(100L)
.verifyComplete();
verify(logRepository).count();
}
@Test
void testCountToday() {
when(logRepository.countByCreatedAtAfter(any(LocalDateTime.class))).thenReturn(Mono.just(10L));
Mono<Long> result = operationLogService.countToday();
StepVerifier.create(result)
.expectNext(10L)
.verifyComplete();
verify(logRepository).countByCreatedAtAfter(any(LocalDateTime.class));
}
}
@@ -0,0 +1,122 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysDictData;
import cn.novalon.manage.sys.core.repository.ISysDictDataRepository;
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 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.ArgumentMatchers.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class SysDictDataServiceTest {
@Mock
private ISysDictDataRepository repository;
private SysDictDataService dictDataService;
private SysDictData testDictData;
@BeforeEach
void setUp() {
dictDataService = new SysDictDataService(repository);
testDictData = new SysDictData();
testDictData.setId(1L);
testDictData.setDictTypeId(1L);
testDictData.setDictLabel("正常");
testDictData.setDictValue("1");
testDictData.setDictSort(1);
testDictData.setDictType("sys_status");
testDictData.setStatus("0");
testDictData.setCreatedAt(LocalDateTime.now());
}
@Test
void testFindAll() {
when(repository.findByDeletedAtIsNull()).thenReturn(Flux.just(testDictData));
Flux<SysDictData> result = dictDataService.findAll();
StepVerifier.create(result)
.expectNext(testDictData)
.verifyComplete();
verify(repository).findByDeletedAtIsNull();
}
@Test
void testFindByDictType() {
when(repository.findByDictTypeAndDeletedAtIsNull("sys_status")).thenReturn(Flux.just(testDictData));
Flux<SysDictData> result = dictDataService.findByDictType("sys_status");
StepVerifier.create(result)
.expectNext(testDictData)
.verifyComplete();
verify(repository).findByDictTypeAndDeletedAtIsNull("sys_status");
}
@Test
void testFindByDictTypeAndStatus() {
when(repository.findByDictTypeAndStatusAndDeletedAtIsNull("sys_status", "0")).thenReturn(Flux.just(testDictData));
Flux<SysDictData> result = dictDataService.findByDictTypeAndStatus("sys_status", "0");
StepVerifier.create(result)
.expectNext(testDictData)
.verifyComplete();
verify(repository).findByDictTypeAndStatusAndDeletedAtIsNull("sys_status", "0");
}
@Test
void testFindById() {
when(repository.findById(1L)).thenReturn(Mono.just(testDictData));
Mono<SysDictData> result = dictDataService.findById(1L);
StepVerifier.create(result)
.expectNext(testDictData)
.verifyComplete();
verify(repository).findById(1L);
}
@Test
void testSave() {
when(repository.save(any(SysDictData.class))).thenReturn(Mono.just(testDictData));
Mono<SysDictData> result = dictDataService.save(testDictData);
StepVerifier.create(result)
.expectNext(testDictData)
.verifyComplete();
verify(repository).save(any(SysDictData.class));
}
@Test
void testDeleteById() {
when(repository.deleteByIdAndDeletedAtIsNull(1L)).thenReturn(Mono.empty());
Mono<Void> result = dictDataService.deleteById(1L);
StepVerifier.create(result)
.verifyComplete();
verify(repository).deleteByIdAndDeletedAtIsNull(1L);
}
}
@@ -0,0 +1,107 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysDictType;
import cn.novalon.manage.sys.core.repository.ISysDictTypeRepository;
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 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.ArgumentMatchers.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class SysDictTypeServiceTest {
@Mock
private ISysDictTypeRepository repository;
private SysDictTypeService dictTypeService;
private SysDictType testDictType;
@BeforeEach
void setUp() {
dictTypeService = new SysDictTypeService(repository);
testDictType = new SysDictType();
testDictType.setId(1L);
testDictType.setDictName("系统状态");
testDictType.setDictType("sys_status");
testDictType.setStatus("0");
testDictType.setRemark("系统状态字典");
testDictType.setCreatedAt(LocalDateTime.now());
}
@Test
void testFindAll() {
when(repository.findByDeletedAtIsNull()).thenReturn(Flux.just(testDictType));
Flux<SysDictType> result = dictTypeService.findAll();
StepVerifier.create(result)
.expectNext(testDictType)
.verifyComplete();
verify(repository).findByDeletedAtIsNull();
}
@Test
void testFindById() {
when(repository.findById(1L)).thenReturn(Mono.just(testDictType));
Mono<SysDictType> result = dictTypeService.findById(1L);
StepVerifier.create(result)
.expectNext(testDictType)
.verifyComplete();
verify(repository).findById(1L);
}
@Test
void testFindByDictType() {
when(repository.findByDictTypeAndDeletedAtIsNull("sys_status")).thenReturn(Mono.just(testDictType));
Mono<SysDictType> result = dictTypeService.findByDictType("sys_status");
StepVerifier.create(result)
.expectNext(testDictType)
.verifyComplete();
verify(repository).findByDictTypeAndDeletedAtIsNull("sys_status");
}
@Test
void testSave() {
when(repository.save(any(SysDictType.class))).thenReturn(Mono.just(testDictType));
Mono<SysDictType> result = dictTypeService.save(testDictType);
StepVerifier.create(result)
.expectNext(testDictType)
.verifyComplete();
verify(repository).save(any(SysDictType.class));
}
@Test
void testDeleteById() {
when(repository.deleteByIdAndDeletedAtIsNull(1L)).thenReturn(Mono.empty());
Mono<Void> result = dictTypeService.deleteById(1L);
StepVerifier.create(result)
.verifyComplete();
verify(repository).deleteByIdAndDeletedAtIsNull(1L);
}
}
@@ -0,0 +1,194 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysExceptionLog;
import cn.novalon.manage.sys.core.repository.ISysExceptionLogRepository;
import cn.novalon.manage.common.dto.PageRequest;
import cn.novalon.manage.common.dto.PageResponse;
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 reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import java.time.LocalDateTime;
import java.util.List;
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 SysExceptionLogServiceTest {
@Mock
private ISysExceptionLogRepository repository;
private SysExceptionLogService exceptionLogService;
private SysExceptionLog testExceptionLog;
@BeforeEach
void setUp() {
exceptionLogService = new SysExceptionLogService(repository);
testExceptionLog = new SysExceptionLog();
testExceptionLog.setId(1L);
testExceptionLog.setUsername("testuser");
testExceptionLog.setTitle("test operation");
testExceptionLog.setExceptionName("NullPointerException");
testExceptionLog.setExceptionMsg("Test exception");
testExceptionLog.setCreateTime(LocalDateTime.now());
}
@Test
void testFindAll() {
when(repository.findAllByOrderByCreateTimeDesc()).thenReturn(Flux.just(testExceptionLog));
Flux<SysExceptionLog> result = exceptionLogService.findAll();
StepVerifier.create(result)
.expectNext(testExceptionLog)
.verifyComplete();
verify(repository).findAllByOrderByCreateTimeDesc();
}
@Test
void testFindByUsername() {
when(repository.findByUsernameOrderByCreateTimeDesc("testuser")).thenReturn(Flux.just(testExceptionLog));
Flux<SysExceptionLog> result = exceptionLogService.findByUsername("testuser");
StepVerifier.create(result)
.expectNext(testExceptionLog)
.verifyComplete();
verify(repository).findByUsernameOrderByCreateTimeDesc("testuser");
}
@Test
void testFindByCreateTimeBetween() {
LocalDateTime startTime = LocalDateTime.now().minusDays(1);
LocalDateTime endTime = LocalDateTime.now();
when(repository.findByCreateTimeBetweenOrderByCreateTimeDesc(startTime, endTime))
.thenReturn(Flux.just(testExceptionLog));
Flux<SysExceptionLog> result = exceptionLogService.findByCreateTimeBetween(startTime, endTime);
StepVerifier.create(result)
.expectNext(testExceptionLog)
.verifyComplete();
verify(repository).findByCreateTimeBetweenOrderByCreateTimeDesc(startTime, endTime);
}
@Test
void testSave() {
when(repository.save(any(SysExceptionLog.class))).thenReturn(Mono.just(testExceptionLog));
Mono<SysExceptionLog> result = exceptionLogService.save(testExceptionLog);
StepVerifier.create(result)
.expectNext(testExceptionLog)
.verifyComplete();
verify(repository).save(any(SysExceptionLog.class));
}
@Test
void testFindById() {
when(repository.findById(1L)).thenReturn(Mono.just(testExceptionLog));
Mono<SysExceptionLog> result = exceptionLogService.findById(1L);
StepVerifier.create(result)
.expectNext(testExceptionLog)
.verifyComplete();
verify(repository).findById(1L);
}
@Test
void testFindExceptionLogsByPage() {
PageRequest pageRequest = new PageRequest();
pageRequest.setPage(0);
pageRequest.setSize(10);
when(repository.findAllByOrderByCreateTimeDesc()).thenReturn(Flux.just(testExceptionLog));
when(repository.count()).thenReturn(Mono.just(1L));
Mono<PageResponse<SysExceptionLog>> result = exceptionLogService.findExceptionLogsByPage(pageRequest);
StepVerifier.create(result)
.expectNextMatches(response ->
response.getTotalElements() == 1L &&
response.getTotalPages() == 1 &&
response.getContent().size() == 1)
.verifyComplete();
verify(repository).findAllByOrderByCreateTimeDesc();
verify(repository).count();
}
@Test
void testFindExceptionLogsByPage_WithKeyword() {
PageRequest pageRequest = new PageRequest();
pageRequest.setPage(0);
pageRequest.setSize(10);
pageRequest.setKeyword("test");
when(repository.findAllByOrderByCreateTimeDesc()).thenReturn(Flux.just(testExceptionLog));
when(repository.count()).thenReturn(Mono.just(1L));
Mono<PageResponse<SysExceptionLog>> result = exceptionLogService.findExceptionLogsByPage(pageRequest);
StepVerifier.create(result)
.expectNextMatches(response ->
response.getTotalElements() == 1L &&
response.getContent().size() == 1)
.verifyComplete();
verify(repository).findAllByOrderByCreateTimeDesc();
verify(repository).count();
}
@Test
void testFindExceptionLogsByPage_WithSort() {
PageRequest pageRequest = new PageRequest();
pageRequest.setPage(0);
pageRequest.setSize(10);
pageRequest.setSort("username");
pageRequest.setOrder("desc");
when(repository.findAllByOrderByCreateTimeDesc()).thenReturn(Flux.just(testExceptionLog));
when(repository.count()).thenReturn(Mono.just(1L));
Mono<PageResponse<SysExceptionLog>> result = exceptionLogService.findExceptionLogsByPage(pageRequest);
StepVerifier.create(result)
.expectNextMatches(response ->
response.getTotalElements() == 1L &&
response.getContent().size() == 1)
.verifyComplete();
verify(repository).findAllByOrderByCreateTimeDesc();
verify(repository).count();
}
@Test
void testCount() {
when(repository.count()).thenReturn(Mono.just(50L));
Mono<Long> result = exceptionLogService.count();
StepVerifier.create(result)
.expectNext(50L)
.verifyComplete();
verify(repository).count();
}
}
@@ -0,0 +1,197 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysLoginLog;
import cn.novalon.manage.sys.core.repository.ISysLoginLogRepository;
import cn.novalon.manage.common.dto.PageRequest;
import cn.novalon.manage.common.dto.PageResponse;
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 reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import java.time.LocalDateTime;
import java.util.List;
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 SysLoginLogServiceTest {
@Mock
private ISysLoginLogRepository repository;
private SysLoginLogService loginLogService;
private SysLoginLog testLoginLog;
@BeforeEach
void setUp() {
loginLogService = new SysLoginLogService(repository);
testLoginLog = new SysLoginLog();
testLoginLog.setId(1L);
testLoginLog.setUsername("testuser");
testLoginLog.setIp("192.168.1.1");
testLoginLog.setLocation("北京");
testLoginLog.setBrowser("Chrome");
testLoginLog.setOs("Windows");
testLoginLog.setStatus("1");
testLoginLog.setMessage("登录成功");
testLoginLog.setLoginTime(LocalDateTime.now());
}
@Test
void testFindAll() {
when(repository.findAllByOrderByLoginTimeDesc()).thenReturn(Flux.just(testLoginLog));
Flux<SysLoginLog> result = loginLogService.findAll();
StepVerifier.create(result)
.expectNext(testLoginLog)
.verifyComplete();
verify(repository).findAllByOrderByLoginTimeDesc();
}
@Test
void testFindByUsername() {
when(repository.findByUsernameOrderByLoginTimeDesc("testuser")).thenReturn(Flux.just(testLoginLog));
Flux<SysLoginLog> result = loginLogService.findByUsername("testuser");
StepVerifier.create(result)
.expectNext(testLoginLog)
.verifyComplete();
verify(repository).findByUsernameOrderByLoginTimeDesc("testuser");
}
@Test
void testFindByLoginTimeBetween() {
LocalDateTime startTime = LocalDateTime.now().minusDays(1);
LocalDateTime endTime = LocalDateTime.now();
when(repository.findByLoginTimeBetweenOrderByLoginTimeDesc(startTime, endTime))
.thenReturn(Flux.just(testLoginLog));
Flux<SysLoginLog> result = loginLogService.findByLoginTimeBetween(startTime, endTime);
StepVerifier.create(result)
.expectNext(testLoginLog)
.verifyComplete();
verify(repository).findByLoginTimeBetweenOrderByLoginTimeDesc(startTime, endTime);
}
@Test
void testSave() {
when(repository.save(any(SysLoginLog.class))).thenReturn(Mono.just(testLoginLog));
Mono<SysLoginLog> result = loginLogService.save(testLoginLog);
StepVerifier.create(result)
.expectNext(testLoginLog)
.verifyComplete();
verify(repository).save(any(SysLoginLog.class));
}
@Test
void testFindById() {
when(repository.findById(1L)).thenReturn(Mono.just(testLoginLog));
Mono<SysLoginLog> result = loginLogService.findById(1L);
StepVerifier.create(result)
.expectNext(testLoginLog)
.verifyComplete();
verify(repository).findById(1L);
}
@Test
void testFindLoginLogsByPage() {
PageRequest pageRequest = new PageRequest();
pageRequest.setPage(0);
pageRequest.setSize(10);
when(repository.findAllByOrderByLoginTimeDesc()).thenReturn(Flux.just(testLoginLog));
when(repository.count()).thenReturn(Mono.just(1L));
Mono<PageResponse<SysLoginLog>> result = loginLogService.findLoginLogsByPage(pageRequest);
StepVerifier.create(result)
.expectNextMatches(response ->
response.getTotalElements() == 1L &&
response.getTotalPages() == 1 &&
response.getContent().size() == 1)
.verifyComplete();
verify(repository).findAllByOrderByLoginTimeDesc();
verify(repository).count();
}
@Test
void testFindLoginLogsByPage_WithKeyword() {
PageRequest pageRequest = new PageRequest();
pageRequest.setPage(0);
pageRequest.setSize(10);
pageRequest.setKeyword("test");
when(repository.findAllByOrderByLoginTimeDesc()).thenReturn(Flux.just(testLoginLog));
when(repository.count()).thenReturn(Mono.just(1L));
Mono<PageResponse<SysLoginLog>> result = loginLogService.findLoginLogsByPage(pageRequest);
StepVerifier.create(result)
.expectNextMatches(response ->
response.getTotalElements() == 1L &&
response.getContent().size() == 1)
.verifyComplete();
verify(repository).findAllByOrderByLoginTimeDesc();
verify(repository).count();
}
@Test
void testFindLoginLogsByPage_WithSort() {
PageRequest pageRequest = new PageRequest();
pageRequest.setPage(0);
pageRequest.setSize(10);
pageRequest.setSort("username");
pageRequest.setOrder("desc");
when(repository.findAllByOrderByLoginTimeDesc()).thenReturn(Flux.just(testLoginLog));
when(repository.count()).thenReturn(Mono.just(1L));
Mono<PageResponse<SysLoginLog>> result = loginLogService.findLoginLogsByPage(pageRequest);
StepVerifier.create(result)
.expectNextMatches(response ->
response.getTotalElements() == 1L &&
response.getContent().size() == 1)
.verifyComplete();
verify(repository).findAllByOrderByLoginTimeDesc();
verify(repository).count();
}
@Test
void testCount() {
when(repository.count()).thenReturn(Mono.just(100L));
Mono<Long> result = loginLogService.count();
StepVerifier.create(result)
.expectNext(100L)
.verifyComplete();
verify(repository).count();
}
}
@@ -0,0 +1,223 @@
package cn.novalon.manage.sys.core.service.impl;
import cn.novalon.manage.sys.core.domain.SysMenu;
import cn.novalon.manage.sys.core.repository.ISysMenuRepository;
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 reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import java.time.LocalDateTime;
import java.util.Arrays;
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 SysMenuServiceTest {
@Mock
private ISysMenuRepository menuRepository;
private SysMenuService menuService;
private SysMenu testMenu;
@BeforeEach
void setUp() {
menuService = new SysMenuService(menuRepository);
testMenu = new SysMenu();
testMenu.setId(1L);
testMenu.setMenuName("系统管理");
testMenu.setParentId(0L);
testMenu.setOrderNum(1);
testMenu.setMenuType("M");
testMenu.setPerms("system");
testMenu.setComponent("system");
testMenu.setStatus(1);
testMenu.setCreatedAt(LocalDateTime.now());
}
@Test
void testFindById() {
when(menuRepository.findById(1L)).thenReturn(Mono.just(testMenu));
Mono<SysMenu> result = menuService.findById(1L);
StepVerifier.create(result)
.expectNext(testMenu)
.verifyComplete();
verify(menuRepository).findById(1L);
}
@Test
void testFindAll() {
when(menuRepository.findAll()).thenReturn(Flux.just(testMenu));
Flux<SysMenu> result = menuService.findAll();
StepVerifier.create(result)
.expectNext(testMenu)
.verifyComplete();
verify(menuRepository).findAll();
}
@Test
void testFindByParentId() {
when(menuRepository.findByParentId(0L)).thenReturn(Flux.just(testMenu));
Flux<SysMenu> result = menuService.findByParentId(0L);
StepVerifier.create(result)
.expectNext(testMenu)
.verifyComplete();
verify(menuRepository).findByParentId(0L);
}
@Test
void testCreateMenu() {
when(menuRepository.save(any(SysMenu.class))).thenReturn(Mono.just(testMenu));
Mono<SysMenu> result = menuService.createMenu(testMenu);
StepVerifier.create(result)
.expectNextMatches(menu ->
menu.getId().equals(1L) &&
menu.getMenuName().equals("系统管理") &&
menu.getCreatedAt() != null)
.verifyComplete();
verify(menuRepository).save(any(SysMenu.class));
}
@Test
void testCreateMenuWithCommand() {
CreateMenuCommand command = new CreateMenuCommand(
0L, "用户管理", "M", 2, "user", "user:manage", 1
);
SysMenu createdMenu = new SysMenu();
createdMenu.setId(2L);
createdMenu.setMenuName("用户管理");
createdMenu.setParentId(0L);
createdMenu.setOrderNum(2);
createdMenu.setMenuType("M");
createdMenu.setPerms("user:manage");
createdMenu.setComponent("user");
createdMenu.setStatus(1);
createdMenu.setCreatedAt(LocalDateTime.now());
when(menuRepository.save(any(SysMenu.class))).thenReturn(Mono.just(createdMenu));
Mono<SysMenu> result = menuService.createMenu(command);
StepVerifier.create(result)
.expectNextMatches(menu ->
menu.getMenuName().equals("用户管理") &&
menu.getParentId().equals(0L) &&
menu.getCreatedAt() != null)
.verifyComplete();
verify(menuRepository).save(any(SysMenu.class));
}
@Test
void testUpdateMenu() {
when(menuRepository.save(any(SysMenu.class))).thenReturn(Mono.just(testMenu));
Mono<SysMenu> result = menuService.updateMenu(testMenu);
StepVerifier.create(result)
.expectNextMatches(menu ->
menu.getId().equals(1L) &&
menu.getUpdatedAt() != null)
.verifyComplete();
verify(menuRepository).save(any(SysMenu.class));
}
@Test
void testUpdateMenuWithCommand() {
UpdateMenuCommand command = new UpdateMenuCommand(
1L, 0L, "系统管理(更新)", "M", 1, "system", "system:manage", 1
);
when(menuRepository.findById(1L)).thenReturn(Mono.just(testMenu));
when(menuRepository.save(any(SysMenu.class))).thenReturn(Mono.just(testMenu));
Mono<SysMenu> result = menuService.updateMenu(command);
StepVerifier.create(result)
.expectNextMatches(menu ->
menu.getMenuName().equals("系统管理(更新)") &&
menu.getUpdatedAt() != null)
.verifyComplete();
verify(menuRepository).findById(1L);
verify(menuRepository).save(any(SysMenu.class));
}
@Test
void testUpdateMenuWithCommand_NotFound() {
UpdateMenuCommand command = new UpdateMenuCommand(
999L, 0L, "不存在的菜单", "M", 1, "system", "system:manage", 1
);
when(menuRepository.findById(999L)).thenReturn(Mono.empty());
Mono<SysMenu> result = menuService.updateMenu(command);
StepVerifier.create(result)
.expectErrorMatches(ex -> ex.getMessage().contains("Menu not found"))
.verify();
verify(menuRepository).findById(999L);
}
@Test
void testDeleteMenu() {
when(menuRepository.deleteById(1L)).thenReturn(Mono.empty());
Mono<Void> result = menuService.deleteMenu(1L);
StepVerifier.create(result)
.verifyComplete();
verify(menuRepository).deleteById(1L);
}
@Test
void testBuildMenuTree() {
SysMenu parentMenu = new SysMenu();
parentMenu.setId(1L);
parentMenu.setMenuName("系统管理");
parentMenu.setParentId(0L);
SysMenu childMenu = new SysMenu();
childMenu.setId(2L);
childMenu.setMenuName("用户管理");
childMenu.setParentId(1L);
when(menuRepository.findAll()).thenReturn(Flux.just(parentMenu, childMenu));
Flux<SysMenu> result = menuService.buildMenuTree(menuService.findAll());
StepVerifier.create(result)
.expectNextMatches(menu ->
menu.getId().equals(1L) &&
menu.getChildren() != null &&
menu.getChildren().size() == 1)
.verifyComplete();
}
}