Java 调用服务层方法时出现NullPointerException

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

我正在JUnit上测试一些服务层方法,但是我得到了NPE错误

这是我的junit代码

@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。