JUNIT-在spring数据JPA中调用findAll时出现空指针异常
我不熟悉Junits和Mockito,我正在编写一个单元测试类来测试我的服务类CourseService.java,它正在调用CourseSepository.class的JUNIT-在spring数据JPA中调用findAll时出现空指针异常,spring,junit,spring-data-jpa,mockito,Spring,Junit,Spring Data Jpa,Mockito,我不熟悉Junits和Mockito,我正在编写一个单元测试类来测试我的服务类CourseService.java,它正在调用CourseSepository.class的findAll()方法,该方法实现Crudepository 服务等级 @Service public class CourseService { @Autowired CourseRepository courseRepository; public void setCourseRepositor
findAll(
)方法,该方法实现Crudepository
服务等级
@Service
public class CourseService {
@Autowired
CourseRepository courseRepository;
public void setCourseRepository(CourseRepository courseRepository) {
this.courseRepository = courseRepository;
}
public Boolean getAllTopics() {
ArrayList<Topics> topicList=(ArrayList<Topics>) courseRepository.findAll();
if(topicList.isEmpty())
{
return false;
}
return true;
}
}
public interface CourseRepository extends CrudRepository<Topics,Long>{
}
@Entity
@Table(name="Book")
public class Topics {
@Id
@Column(name="Topicid")
private long topicId;
@Column(name="Topictitle",nullable=false)
private String topicTitle;
@Column(name="Topicauthor",nullable=false)
private String topicAuthor;
public long getTopicId() {
return topicId;
}
public void setTopicId(long topicId) {
this.topicId = topicId;
}
public String getTopicTitle() {
return topicTitle;
}
public void setTopicTitle(String topicTitle) {
this.topicTitle = topicTitle;
}
public String getTopicAuthor() {
return topicAuthor;
}
public void setTopicAuthor(String topicAuthor) {
this.topicAuthor = topicAuthor;
}
public Topics(long topicId, String topicTitle, String topicAuthor) {
super();
this.topicId = topicId;
this.topicTitle = topicTitle;
this.topicAuthor = topicAuthor;
}
}
下面是我编写的Junit类,但是courseRepository
被初始化为NULL,因此我得到了NullPointerException
public class CourseServiceTest {
@Mock
private CourseRepository courseRepository;
@InjectMocks
private CourseService courseService;
Topics topics;
@Mock
private Iterable<Topics> topicsList;
@Before
public void setUp() {
MockitoAnnotations.initMocks(CourseServiceTest.class);
}
@Test
public void test_Get_Topic_Details() {
List<Topics> topics = new ArrayList<Topics>();
Mockito.when(courseRepository.findAll()).thenReturn(topics);
boolean result=courseService.getAllTopics();
assertTrue(result);
}
}
公共类课程服务测试{
@嘲弄
私人课程专业课程专业课程;
@注射模拟
私人课程服务;
主题;
@嘲弄
私人可编辑主题列表;
@以前
公共作废设置(){
initMocks(CourseServiceTest.class);
}
@试验
公共无效测试\u获取\u主题\u详细信息(){
列表主题=新建ArrayList();
Mockito.when(courseRepository.findAll())。然后返回(主题);
布尔结果=courseService.getAllTopics();
资产真实性(结果);
}
}
将setUp()
方法更改为:
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
您可能正在处理框架上的一些问题,以使框架注入模拟类 我建议使用,这样您就不需要依赖反射和
@Inject
/@Mock
注释来实现此功能:
@Service
public class CourseService {
private final CourseRepository courseRepository;
// @Autowired annotation is optional when using constructor injection
CourseService (CourseRepository courseRepository) {
this.courseRepository = courseRepository;
}
// .... code
}
测试:
@Test
public void test_Get_Topic_Details() {
List<Topics> topics = new ArrayList<Topics>();
Mockito.when(courseRepository.findAll()).thenReturn(topics);
CourseService courseService = new CourseService(courseRepository);
boolean result = courseService.getAllTopics();
assertTrue(result);
}
@测试
公共无效测试\u获取\u主题\u详细信息(){
列表主题=新建ArrayList();
Mockito.when(courseRepository.findAll())。然后返回(主题);
CourseService CourseService=新的CourseService(CourseSepository);
布尔结果=courseService.getAllTopics();
资产真实性(结果);
}