簡體   English   中英

如何對對MyBatis Mapper接口基本上是一對一調用的服務方法進行單元測試

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM