Powermock + JUnit - исключение NullPointerException с новым классом - PullRequest
0 голосов
/ 03 января 2019

Получение NullPointerException, когда я пытаюсь смоделировать метод, и у этого метода есть локальная переменная с новым классом.Пробовал по-другому, но не повезло.Пожалуйста, смотрите комментарии, я упомянул то, что я пробовал и где я получаю исключение.

Заранее спасибо!

    @RunWith(PowerMockRunner.class)
    @PrepareForTest(StudentController.class)
    public class StudentControllerTest {
        @Mock
        HttpServletRequest request;

        @Mock
        StudentService studentService;

        @InjectMocks
        StudentController studentController;
        @Test
        public void create() {
            Student student =mock(Student.class);
            **// Also tried Student student = new Student();**
            student.setName("Name");
            student.setAddress("New York");

            when(studentService.create(student)).thenReturn(student);
            // if I try below code I am getting compile error - Type mismatch: cannot convert from Matcher<Student> to Student
 //when(studentService.create(any(Student.class))).thenReturn(student);
            Student createdStudent= studentController("Name", "New York", 1);
            assertTrue(0 < createdStudent.getStudentId())
        }
    }

Studentcontroller.java

@PostMapping("/api/student/create")
public Student create(HttpServletRequest request, @RequestParam("name") String name, @RequestParam("address") String address, @RequestParam("grade") String grade) {

    Student student = new Student();
    try {
        student.setName(name);
        student.setAddress(address);
        student.setGrade(Integer.decode(grade));

        student = studentService.create(student);
        **// Throwing NullPointer in this line. I did dubug and can see student returned is null**
        message = "Successfully Created Student[" + student.getId() + "] " + name;  

    } catch (Exception e) {
        message = "Exception while create the student: " + name;
        log.error(message + "\n" + StackTraceUtil.getStackTrace(e));
        student.setErrorMessage(message);
    }

    return student;
}

РЕШЕНИЕ:

Я использовал org.hamcrest.CoreMatchers.any Это дает ошибку компиляции Type mismatch: cannot convert from Matcher<Student> to Student

Теперь я изменил его на org.mockito.ArgumentMatcher.any Вы можете выбрать одиниз ниже двух.Оба будут работать.

Ключ импортировал org.mockito.ArgumentMatcher.any

Student student =mock(Student.class);
student.setName("Name");
student.setAddress("New York");

ИЛИ

Student student = new Student();
student.setName("Name");
student.setAddress("New York");

1 Ответ

0 голосов
/ 03 января 2019

Исходя из тестируемого метода, жесткой связи с новым Student () и того факта, что настройки соответствия в тесте не будут совпадать с настройками, созданными в тестируемом методе, тогда studentService.create вернет null .

В действительности не требуется макет Student, так как тестируемый метод уже создает его.

Используйте более гибкий метод сопоставления аргументов, например any(Student.class), захватите переданный аргумент в настройке и установите желаемый идентификатор, чтобы тестируемый метод мог выполняться до завершения.

Например

@RunWith(PowerMockRunner.class)
@PrepareForTest(StudentController.class)
public class StudentControllerTest {
    @Mock
    HttpServletRequest request;

    @Mock
    StudentService studentService;

    @InjectMocks
    StudentController studentController;

    @Test
    public void create() {
        //Arrange
        int expectedId = 1;
        when(studentService.create(any(Student.class)))
            .thenAnswer(i -> {
                Student student = (Student)i.getArguments()[0];
                //manipulate the student as needed.
                //Like setting an id

                //...student.setId(expectedId)

                return student;
            });

        //Act
        Student createdStudent = studentController.create(request, "Name", "New York", 1);

        //Assert
        assertTrue(createdStudent != null);
        assertTrue(expectedId == createdStudent.getStudentId());
    }
}
...