java使用junit+mockito单元测试报空指针错误,测试的服务层实现方法里面还调用其它服务层方法怎么写单元测试,能个给个例子么
时间: 2024-02-01 15:03:38 浏览: 68
好的,我来为您解答。在单元测试中,我们需要模拟依赖对象的行为,避免实际调用依赖对象,因为这会引起不必要的复杂性和依赖性。Mockito是一个流行的mock框架,可以帮助我们轻松地模拟依赖对象的行为。
下面是一个示例,展示如何使用JUnit和Mockito来编写服务层的单元测试。这个示例是一个用户服务层,其中包含了两个方法,一个是获取用户信息的方法,另一个是更新用户信息的方法。其中更新用户信息的方法依赖于另一个用户服务层的方法,我们需要使用Mockito来模拟这个依赖对象的行为。
```java
public class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserServiceImpl userService;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testGetUser() {
User user = new User();
user.setId(1L);
user.setName("Alice");
user.setAge(20);
when(userRepository.findById(1L)).thenReturn(Optional.of(user));
UserDto userDto = userService.getUser(1L);
assertEquals(userDto.getId(), user.getId());
assertEquals(userDto.getName(), user.getName());
assertEquals(userDto.getAge(), user.getAge());
}
@Test
public void testUpdateUser() {
User user = new User();
user.setId(1L);
user.setName("Alice");
user.setAge(20);
UserUpdateDto userUpdateDto = new UserUpdateDto();
userUpdateDto.setName("Bob");
userUpdateDto.setAge(21);
when(userRepository.findById(1L)).thenReturn(Optional.of(user));
userService.updateUser(1L, userUpdateDto);
assertEquals(user.getName(), "Bob");
assertEquals(user.getAge(), 21);
}
}
```
在上面的示例中,我们使用@Mock注解来注入一个模拟的UserRepository对象,并使用@InjectMocks注解来注入UserService实现类。在setUp()方法中,我们使用MockitoAnnotations.initMocks()方法来初始化这些注解。
在testGetUser()方法中,我们使用when()方法来模拟UserRepository的findById()方法,返回一个模拟的User对象。然后我们调用userService的getUser()方法,并断言返回的UserDto对象的属性与模拟的User对象的属性相同。
在testUpdateUser()方法中,我们使用when()方法来模拟UserRepository的findById()方法,返回模拟的User对象。然后我们调用userService的updateUser()方法,并断言模拟的User对象的属性与更新后的UserUpdateDto对象的属性相同。
希望这个例子能够帮助您理解如何使用JUnit和Mockito来编写服务层的单元测试。
阅读全文