[英]How to unit test service methods that are basically 1 to 1 calls to a MyBatis Mapper interface
我是MyBatis和單元測試的新手。
我有一個CourseService
類,此類(目前)僅具有調用並返回MyBatis映射器( CourseMapper
)的等效方法的方法。
CourseService類。
@Autowired
private CourseMapper courseMapper;
public Course getById(int id) {
return courseMapper.getById(id);
}
...
CourseMapper界面。
@Select("select from courses where id = #{id}")
public Course getById(int id);
...
我應該單元測試courseService.getById(id)
嗎? 模擬Mapper並使用該Mapper構造服務,並進行對getById
的模擬調用返回帶有ID作為參數傳遞的Course的方法是否合適?
when(courseMapper.getCourseById(anyInt()))
.thenAnswer(this::returnCourseWithSameIdThatInTheArgument);
...
private Course CourseWithSameIdThatInTheArgument(InvocationOnMock i) {
return new Course((int)i.getArguments()[0],true,1,"","",1);
}
先感謝您。
理想情況下,您應該模擬CourseMapper
並驗證是否使用預期id
一次調用了courseMapper.getById(id)
像這樣
Mockito.verify(courseMapper,Mockito.times(1))。getById(id)
這樣做的原因是-CourseMapper是一個不同的類,您可以假設它已經過測試。 您在此處執行的操作是取消不需要CourseMapper.getById()
的行為。
通常,有關驗證的規則:
期待Mocks做出某些行為,不要期望Stubs做出某些行為。
由於存根可能還會記錄行為,因此很想對其進行一些驗證。
您需要記住,它們的唯一目的是為以后的處理或命令調用提供數據(這是被測類的實際功能)。
查詢不會改變世界,因此可以調用任意次,包括無一次。
另一方面,命令調用(在Mocks上調用)可能會產生副作用,並且會改變目標對象之外的世界。
您正在嘗試測試違反該規則的存根。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.