如何在服务层模拟一个方法

How to mock a method in Service layer

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

public class UserServiceImpl{

    @Autowired
    UserRepository userRepository;

    public void abc(){
        xyz(obj);
    }

    private void xyz(){
        userRepository.save(obj);
    }
}

我要测试的是abc()方法。在该方法中,它调用 xyz(),这是一个使用 userRepository 依赖项的 PRIVATE 方法。因此,当我为 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);
    }

一些有用的链接: