Spring Boot中JPA Repository的Save方法的单元测试

Aji*_*tap 3 junit junit4 mockito spring-boot

你能告诉我我应该如何使用 Mockito 和 JUnit 为这段代码编写单元测试吗?StudentRepository 是一个扩展 JPA Repository 的接口。

public class StudentService {
    @Autowired
    StudentRepository studentRepository;
    
    public void saveStudentDetails(StudentModel student) {
        Student stud = new Student();
        stud.setStudentId(student.getStudentId());
        stud.setStudentName(student.getStudentName());
        studentRepository.save(stud);
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

几天前我也遇到过同样的情况,我想出了这样的事情。

@InjectMocks
StudentService studentService;
@Mock
StudentRepository studentRepository;

public void saveStudentDetailsTest(){
    //given
    StudentModel student = new StudentModel(Your parameters);
    //when
    studentService.saveStudentDetails(student);
    //then
    verify(studentRepository, times(1)).save(any());
}
Run Code Online (Sandbox Code Playgroud)

你也可以使用 ArgumentCaptor 并检查你传递给 save 的对象是否是你想要的,它看起来像这样

ArgumentCaptor<Student> captor = ArgumentCaptor.forClass(Student.class);
verify(studentRepository).save(captor.capture());
assertTrue(captor.getValue().getStudentName().equals(student.getStudentName()));
Run Code Online (Sandbox Code Playgroud)


Dan*_*cob 2

首先,您希望支持构造函数注入而不是字段注入。如果没有 StudentRepository 的依赖,studentService 就不能工作。更改后,您可以使用 Mockito 等进行单元测试。采取的步骤:

  1. ExtendsWith(MockitoExtension.class)如果是 junit 5,则@RunWith(MockitoJunit4ClassRunner.class)使用 JUnit 4注释该类。
  2. 通过注释该类型的变量来创建一个 StudentRepository Mock@Mock
  3. 通过注释服务的变量将模拟注入到服务中@InjectMocks
  4. 那么你想要定义模拟行为。你可以在构造时使用mockitos 来做到这一点。会是这样的when(studentRepository.myMethod()).thenReturn(MyCustomObject())
  5. 调用服务方法
  6. 断言有关您的服务的某些行为。例如,您可以使用mockito的验证构造来测试studentRepository.save()调用一次。作为旁注,保存不应返回 void,而应实际返回实体本身。