JUnit + Powermock - новая дата () - исключение NullPointerException - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь смоделировать метод службы, где в качестве аргумента передается новая дата.Но я получаю NullPointer.Получение объекта студент как ноль.Любая помощь, пожалуйста ...

Мой код обслуживания: (который я не могу изменить, поскольку он уже находится в производстве и требует большого количества согласований)

Student student = studentService.getStudent(studentId, new Date());
// Getting NullPointerException. When I debug I see student is null
presentDate = DateUtil.convertSqlTimetoCurrentDate(student.getStartTime()); 

Мой тестовый класс

when(studentService.getStudent(1, new Date())).thenReturn(student);

Я тоже пробовал

when(studentService.getStudent(1, any(Date.class))).thenReturn(student);

и

when(studentService.getStudent(eq(1), any(Date.class))).thenReturn(student);

и

when(studentService.getStudent(1, anyobject())).thenReturn(student);

Ответы [ 2 ]

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

Джулиан предоставил чистое решение вашей проблемы, но если вы хотите продолжить с any(), следующий код должен работать, пожалуйста, скопируйте и вставьте его и попробуйте на вашем компьютере.

@Test
public void shouldGetStudent() {
    StudentService service = mock(StudentService.class);
    when(service.getStudent(eq(1), any(Date.class))).thenReturn(new Student());

    Student student = service.getStudent(1, new Date());

    assertNotNull(student);
}

Если у вас это не сработало, возможно, проблема связана со вспомогательными функциями, проверьте следующие параметры.

  1. Убедитесь, что Дата, используемая во время насмешки, указана правильнопакет (java.utils против java.sql).К сожалению, если вы используете неправильный компилятор, он не поймает его в вызове any(Date.class).

  2. Убедитесь, что any() и eq() приходят из org.mockito.Matchers.

  3. Убедитесь, что вы инстанцируете классы mockito правильно.

  4. Вы уверены, что объект ученика из thenReturn(student) не нулевой?

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

Вам нужно подготовить свой класс к тесту и макету конструктора Date (), чтобы ваш studentService всегда вызывался с одинаковыми аргументами.

Вот рабочий пример:

@RunWith(PowerMockRunner.class)
@PrepareForTest( {MockingStudentTest.StudentService.class} )
public class MockingStudentTest {
    private static final Date DATE_TIME = new Date(1398755086992L);

    @Test
    public void shouldReturnTheStudentWithTheRIghtStartTime() throws Exception {
        whenNew(Date.class).withNoArguments().thenReturn(DATE_TIME);

        Date startTime = new StudentService().getStudent(10, new Date()).getStartTime();
        System.out.println(startTime);
        assertEquals(DATE_TIME, startTime);
    }

    class Student {
        private final int id;

        private final Date startTime;

        public Student(int id, Date startTime) {
            this.id = id;
            this.startTime = startTime;
        }
        public Date getStartTime() {
            return startTime;
        }
    }

    class StudentService {
        public Student getStudent(int id, Date startTime) {
            return new Student(id, startTime);
        }
    }
}
...