Spring + Powermock + JUnit вызывает другой сервис из одного сервиса - NullPointerException - PullRequest
0 голосов
/ 26 декабря 2018

Получение исключения NullPointerException.Не уверен, что я делаю не так.Любая помощь будет принята с благодарностью.

Получение NullPointer при вызове

Teacher t = teacherService.getTeacherDetails();

Я сделал отладку и вижу, что teacherService имеет значение null.Я не знаю, почему он пуст, поскольку я уже издеваюсь над этим объектом в своем тестовом классе.

StudentServiceTest.java

@RunWith(PowerMockRunner.class)
@PrepareForTest({StudentService.class, TeacherService.class})
public class StudentServiceTest{

    @InjectMocks
    StudentService studentService;

    @InjectMocks
    TeacherService teacherService;

    @Mock
    private StudentRepository studentRepository;

    @Mock
    private TeacherRepository teacherRepository;

    @Test
    public void getStudentInformation() {
        Student student = new Student();
        Teacher teacher = new Teacher();

        when(studentRepository.getStudentDetails()).thenReturn(student);
        when(teacherRepository.getTeacherDetails()).thenReturn(teacher);

        Student student = studentService.getStudentInformaition();

    }

StudentService.java

   private TeacherService teacherService;

   @Autowired
    public StudentService(TeacherService teacherService) {
        this.teacherService = teacherService;
    }

    public Student getStudentInformaition() {
        Teacher t = teacherService.getTeacherDetails();
        // some logic
        Student s = studentRepository.getStudentDetails();
       // some more logic
       return s;
    }

TeacherService.java

 public Teacher getTeacherDetails() {
        Teacher t = teacherRepository.getTeacherDetails();
        return t;
    }

1 Ответ

0 голосов
/ 26 декабря 2018

Проблема в том, что этот код

@InjectMocks
StudentService studentService;

внедряет определенные экземпляры фиктивного объекта в экземпляр studentService, но экземпляр TeacherService не является фиктивным и поэтому не вводится как имитатор вstudentService instance.

Вы должны настроить свой код примерно так:

@RunWith(PowerMockRunner.class)
@PrepareForTest({StudentService.class, TeacherService.class})
public class StudentServiceTest{

    @InjectMocks
    StudentService studentService;

    @Mock
    TeacherService teacherService;

    @Mock
    private StudentRepository studentRepository;

    @Test
    public void getStudentInformation() {
        Student student = new Student();
        Teacher teacher = mock(Teacher.class);

        when(studentRepository.getStudentDetails()).thenReturn(student);
        when(teacherService.getTeacherDetails()).thenReturn(teacher);
        when(teacher.getFoo()).thenReturn(???);

        Student student = studentService.getStudentInformaition();

    }

Обратите внимание, что teacherService теперь является экземпляром фиктивного объекта, и TeacherRepository больше не требуется ввсе

...