JUnit + Powermock - new Date() - NullPointerException



我试图模拟一种服务方法,其中新日期作为参数传递。但是我得到了空指针。将学生对象获取为空。请帮忙...

我的服务代码:(我无法更改,因为它已经在生产中并且需要大量批准)

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);

你需要为测试和模拟 Date() 构造函数准备你的类,这样你的学生服务将始终使用相同的参数被调用。

这是一个工作示例:

@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);
        }
    }
}

Julian 为您的问题提供了一个干净的解决方案,但如果您想继续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 vs java.sql)。不幸的是,如果您使用错误的编译器,则不会在any(Date.class)调用中捕获它。

  2. 确保any()eq()来自org.mockito.Matchers

  3. 确保正确实例化模拟类。

  4. 您确定来自thenReturn(student)的学生对象不为空吗?

相关内容

  • 没有找到相关文章

最新更新