mock的意義
在微服務(wù)盛行的當下,開發(fā)過程中往往出現(xiàn)A應(yīng)用中某功能的實現(xiàn)需要調(diào)用B應(yīng)用的接口匹厘,無論使用RPC還是restful都需要B應(yīng)用提供接口的實現(xiàn)整個開發(fā)工作才能繼續(xù)進行屯蹦。從而導(dǎo)致A應(yīng)用的開發(fā)停滯维哈,整個系統(tǒng)的開發(fā)效率降低绳姨。
這時該mock出場了。通過模擬一個接口的實現(xiàn)阔挠,讓A應(yīng)用假設(shè)能夠正常調(diào)用B應(yīng)用飘庄,并得到相應(yīng)的返回值或產(chǎn)生指定類型的異常。
待B應(yīng)用的接口實現(xiàn)開發(fā)完成再取消mock谒亦,實現(xiàn)真正的調(diào)用竭宰。
以下演示在spring boot test中使用mockito模擬接口實現(xiàn)的使用方式。
引入相關(guān)依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
待測試接口
public interface UserService {
public User findOne(Long id);
}
待測試POJO
public class User {
private Long id;
private String name;
private Date createDate;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
}
編寫測試類
import static org.mockito.Mockito.when;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { AppStart.class })
public class TestUserService {
@Mock
private UserService userService;
private Logger logger = LoggerFactory.getLogger(getClass());
@Before
public void setUp(){
User mockUser = new User();
mockUser.setName("john");
mockUser.setId(1L);
mockUser.setCreateDate(new Date());
when(userService.findOne(1L)).thenReturn(mockUser);
}
@Test
public void findOneTest() {
User user = userService.findOne(1L);
logger.info("user.name = {}",user.getName());
Assert.assertEquals(user.getName(), "john");
}
}
總結(jié)
- 使用@Mock注解對測試接口進行修飾份招。該注解位于org.mockito.Mock中
- 使用when().thenReturn()方法指定測試接口中某方法的返回值切揭。(也可以指定拋出的異常類型等)。