单元测试springboot的service
时间: 2024-12-30 15:25:50 浏览: 7
### 如何在 Spring Boot 中为 Service 层编写单元测试
#### 使用 JUnit 和 Mockito 进行单元测试
对于 `Service` 层的单元测试,通常会使用 JUnit 结合 Mockito 来模拟依赖对象的行为。Mockito 可以帮助创建 mock 对象,从而隔离被测的服务类。
#### 示例:UserService 测试案例
假设有一个简单的 `UserService` 类,它依赖于 `UserRepository` 接口来进行数据访问操作:
```java
package com.example.service;
import com.example.domain.User;
import com.example.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User findUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
}
```
下面是一个针对上述 `UserService` 的单元测试例子:
```java
package com.example.service;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import com.example.domain.User;
import com.example.repository.UserRepository;
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;
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@BeforeEach
void setUp() {}
@Test
void testFindUserById_ExistingId_ReturnsCorrectUser() {
// Arrange (准备阶段)
Long existingUserId = 1L;
User expectedUser = new User();
when(userRepository.findById(existingUserId)).thenReturn(java.util.Optional.of(expectedUser));
// Act (执行阶段)
User actualUser = userService.findUserById(existingUserId);
// Assert (断言阶段)
assertNotNull(actualUser);
assertEquals(expectedUser, actualUser);
verify(userRepository).findById(existingUserId);
}
@Test
void testFindUserById_NonExistentId_ReturnsNull() {
// Arrange (准备阶段)
Long nonExistentUserId = -99L;
when(userRepository.findById(nonExistentUserId)).thenReturn(java.util.Optional.empty());
// Act (执行阶段)
User user = userService.findUserById(nonExistentUserId);
// Assert (断言阶段)
assertNull(user);
verify(userRepository).findById(nonExistentUserId);
}
}
```
在这个例子中,`@ExtendWith(MockitoExtension.class)` 表明此测试类将使用 Mockito 扩展程序来管理 Mock 实例;而 `@Mock` 则用于标记要自动创建的 Mock Bean;最后,`@InjectMocks` 自动注入这些 Mock Beans 到待测试的对象实例里[^4]。
阅读全文