[英]JUNIT - Null pointer Exception while calling findAll in spring Data JPA
我是Junits和Mockito的新手,我正在編寫一個單元測試類來測試我的服務類CourseService.java,它正在調用CourseRepository.class的findAll(
)方法,該方法實現了CrudRepository<Topics,Long>
服務等級
@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);
}
}
將setUp()
方法更改為:
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
可能您正在處理框架上的某些問題,以使模擬類由框架注入。
我建議使用Constructor Injection ,因此您無需依賴反射和@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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.