[英]Mockito Spring Boot gives Null Pointer Exception
我無法在服務層為我的 spring 啟動應用程序運行單元測試,因為它在List<Student> expectedList = studentService.findAl();
. 但是,如果我直接調用模擬,它可以工作List<Student> expectedList = studentRepository.findAll();
. studentRepository 被注入到 studentService 中。 誰能說明問題是什么?
測試類:
import com.demo.student.demo.entity.Student;
import com.demo.student.demo.repository.StudentRepository;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import static org.mockito.Mockito.*;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
public class StudentServiceImplTest {
@Mock
private StudentRepository studentRepository;
@InjectMocks
private StudentServiceImpl studentService;
@Test
public void findAll(){
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1, "person1", "person1@mail.com"));
studentList.add(new Student(2, "person2", "person2@mail.com"));
when(studentRepository.findAll()).thenReturn(studentList);
List<Student> expectedList = studentService.findAl();
assertEquals(0, expectedList.size());
}
}
和存儲庫:
@Repository
public interface StudentRepository extends JpaRepository<Student, Long> {
}
服務接口:
public interface StudentService {
public List<Student> findAl();
public Student findById(long id);
public Student saveOrUpdate(Student student);
public void deleteById(long id);
}
和服務實現:
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentRepository studentRepository;
@Override
public List<Student> findAl() {
return studentRepository.findAll();
}
@Override
public Student findById(long id) {
Optional<Student> student = studentRepository.findById(id);
boolean exist = student.isPresent();
return exist? student.get() : null;
}
@Override
public Student saveOrUpdate(Student student) {
studentRepository.save(student);
return student;
}
@Override
public void deleteById(long id) {
studentRepository.deleteById(id);
}
}
我對你的代碼做了一些修改。 我所做的更改是在StudentServiceImpl
class 中。 我刪除了@Autowired
注釋並進行了構造函數注入。
@Service
public class StudentServiceImpl implements StudentService {
private final StudentRepository studentRepository;
public StudentServiceImpl(StudentRepository studentRepository) {
this.studentRepository = studentRepository;
}
//others are same
}
並在測試class。
@RunWith(MockitoJUnitRunner.class)
public class StudentServiceImplTest {
private StudentService studentService;
private StudentRepository studentRepository;
@Test
public void findAll(){
studentRepository = mock(StudentRepository.class);
studentService = new StudentServiceImpl(studentRepository);
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1, "person1", "person1@mail.com"));
studentList.add(new Student(2, "person2", "person2@mail.com"));
when(studentRepository.findAll()).thenReturn(studentList);
List<Student> expectedList = studentService.findAl();
assertEquals(2, expectedList.size());
}
}
現在我可以看到測試通過了。
另外,請閱讀這篇文章“擺脫@InjectMocks”。
我希望它可以幫助你:) 非常感謝。
您在此處配置的模擬:
StudentRepository studentRepository = mock(StudentRepository.class);
沒有注入到服務中。 在你的測試中刪除 studentRepository 的初始化,只使用你已經用 @Mock 注釋的那個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.