在对服务层的每个方法进行单元测试时,我遇到了以下场景,我不知道如何测试:
public class UserServiceImpl{
@Autowired
UserRepository userRepository;
public void abc(){
xyz(obj);
}
private void xyz(){
userRepository.save(obj);
}
}
我要测试的是abc()
方法。在该方法中,它调用xyz()
,这是一个PRIVATE方法,使用userRepository
依赖项。因此,当我为abc()
方法创建单元测试时,我是否需要关注xyz()
方法,因为它正在使用依赖项?如果是,我需要遵循哪些步骤?
正如您所写的,您需要处理xyz()
方法及其对userRepository
的调用。您需要像下面这样模拟userRepository
:
@ExtendWith(MockitoExtension.class)
public class UserServiceImplTest {
@Mock
private UserRepository userRepository;
@InjectMocks
public UserServiceImpl userService;
@BeforeEach
public void setUp() throws Exception {
// Mock UserRepository behaviour
doReturn(//return value).when(this.userRepository).save(any());
}
// Your tests here
}
由于这是一个void方法,您需要做的是验证依赖项的save
方法是否使用参数obj
恰好调用了一次。您可以使用Mockito
之类的东西来做到这一点。您的单元测试看起来像这样:
@Mock
private UserRepository mockUserRepository;
@InjectMocks
private UserServiceImpl sut;
@Test
public void abc_savesObject() {
// Arrange
...
// Act
sut.abc();
// Assert
verify(mockUserRepository,times(1)).save(obj);
}
一些有用的链接:
- https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html # 4
- https://www.baeldung.com/mockito-verify