如何模拟服务层中的方法



在对服务层的每个方法进行单元测试时,我遇到了以下场景,我不知道如何测试:

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