Java 调用服务层方法时出现NullPointerException
我正在JUnit上测试一些服务层方法,但是我得到了NPE错误 这是我的junit代码Java 调用服务层方法时出现NullPointerException,java,spring,Java,Spring,我正在JUnit上测试一些服务层方法,但是我得到了NPE错误 这是我的junit代码 @Autowired TeacherServiceImpl teacherServiceImpl; @Test public void test(){ String teacherName = "Bernice"; List<Teacher> teachers = new ArrayList<Teacher>(); teachers = teacherServi
@Autowired
TeacherServiceImpl teacherServiceImpl;
@Test
public void test(){
String teacherName = "Bernice";
List<Teacher> teachers = new ArrayList<Teacher>();
teachers = teacherServiceImpl.findTeacherByName(teacherName);**(error here)**
}
@Autowired
教师服务impl教师服务impl;
@试验
公开无效测试(){
String teacherName=“Bernice”;
列表教师=新建ArrayList();
教师=教师服务impl.findTeacherByName(教师名称);**(此处错误)**
}
这是我的服务层代码
@Service
public class TeacherServiceImpl implements TeacherService {
@Autowired
private TeacherDao teacherDao;
public List<Teacher> findTeacherByName(String teacherName){
List<Teacher> teachers = new ArrayList<Teacher>();
teachers = teacherDao.findByNameCn(teacherName);
return teachers;
}
}
@服务
公共类TeacherServiceImpl实现了TeacherService{
@自动连线
私人教师;
公共列表findTeacherByName(字符串教师名称){
列表教师=新建ArrayList();
teachers=teacherDao.findByNameCn(teacherName);
归国教师;
}
}
任何帮助都将不胜感激 我假设您没有使用注释对测试类进行注释。因此,您没有应用程序上下文,因此没有注入
请阅读:-)伙计,你在测试哪门课?如果您想测试TeacherServiceImpl,那么您不应该模拟它,而是使用构造函数(您正在测试模拟atm)。其次,在TeacherServiceImpl.class中,您有一个依赖项。除非您模拟此依赖项并存根您使用的方法(findByNameCn),否则您将获得NPE
因此,在测试中,使用要测试的类的构造函数,并使用Mockito模拟依赖项。别忘了对Runner或ExtendWith使用正确的注释,似乎
TeacherServiceImpl
为空。尝试使用
@Autowired
TeacherService teacherService;
此外,您应该在Spring
中运行测试用例
,这意味着您应该通过在测试类中添加@Runwith
和@springbootest
注释来启动Spring框架
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
public void TeacherServiceTest {
...
}
你应该正确地编写测试 集成测试用于web层,单元测试用于服务层 您正试图使用
@Autowired
编写集成测试,但我假定您没有将其配置为集成测试<代码>NPE表示teacherServiceImpl引用没有对象引用@Autowired
仅在Spring上下文中包含可以注入的bean时才起作用
您不应该为您的服务编写集成测试,这里只适合使用单元测试(使用JUnit+Mockito)
请阅读什么是一般的单元测试:
单元测试示例:
集成测试示例:
但我建议在下次编码之前阅读更多信息;) 您可以共享任何错误日志吗?是否可以添加您的实际测试代码?您使用的是哪种运行程序?另外,您不应该自动连接dao类,而应该模拟它,因为您正在测试服务层方法。您需要显示整个测试用例。请注意,这类问题正是您应该避免
@Autowired
字段并在服务类上使用构造函数注入的原因。(在本例中,可能是因为您直接进行了测试,但它消除了一个常见问题。)此外,使用构造函数注入将允许您直接使用new teacherserviceinpl(mockDao)
在你的测试课上,完全避免Spring。对于投票否决这个答案的人:请留下你不喜欢的评论,这样我可以相应地改进我的答案。谢谢:-)我没有投反对票,但仅供参考,@SpringBootTest
用于集成测试,而不是问题所指的单元测试。由于OP对被测类使用了@Autowired
,我假设他正在尝试加载应用程序上下文。否则,他将不得不使用@Mock和@InjectMocks AFAIK。