spring-boot - Spring + Powermock + JUnit 从一个服务调用另一个服务 - NullPointerException
问题描述
获取 NullPointerException。不知道我做错了什么。任何帮助将不胜感激。
调用时获取 NullPointer
Teacher t = teacherService.getTeacherDetails();
我进行了调试,发现teacherService 为空。我不是为什么它为空,因为我已经在我的测试类中模拟了这个对象。
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();
}
学生服务.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;
}
教师服务.java
public Teacher getTeacherDetails() {
Teacher t = teacherRepository.getTeacherDetails();
return t;
}
解决方案
问题是这段代码
@InjectMocks
StudentService studentService;
将定义的模拟对象实例注入studentService
实例,但实例TeacherService
不是模拟,因此不作为模拟注入studentService
实例。
您应该将代码调整为如下所示:
@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
根本不再需要
推荐阅读
- r - 选择R中向量中的所有值组合
- python - 用于散列算法的 Python 索引为 None
- csv - 如何在不导入空值的情况下从 csv 在 Quick Base 中进行更新导入?
- css - css 固定标题无法正确显示下拉菜单的问题
- symfony - 问题兼容性 symfony/symfony 3.3.* 和 symfony/dotenv 3.4
- javascript - 如何在没有任何条件的情况下返回切换参数javascript
- javascript - 通过大数据的ajax创建动态选择框
- c# - 如何检查数组中的下一个元素?
- python - numpy/scipy 中的哪些操作是多线程的?
- python - 如何将 pandas 导入 VBA 的 Python COM 对象