我试图模拟一种服务方法,其中新日期作为参数传递。但是我得到了空指针。将学生对象获取为空。请帮忙...
我的服务代码:(我无法更改,因为它已经在生产中并且需要大量批准)
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);
}
如果它不适合您,则支持功能可能存在问题,请检查以下选项。
确保模拟期间使用的日期来自正确的包(java.utils vs java.sql)。不幸的是,如果您使用错误的编译器,则不会在
any(Date.class)
调用中捕获它。确保
any()
和eq()
来自org.mockito.Matchers
。确保正确实例化模拟类。
您确定来自
thenReturn(student)
的学生对象不为空吗?