【PowerMock】
参考材料:https://www.bilibili.com/video/BV1DE411h7hx/?p=11&spm_id_from=333.880.my_history.page.click
https://www.imooc.com/article/330983
- pom依赖
<!-- 引入 powermock -->
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-core</artifactId>
<version>2.0.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.2</version>
<scope>test</scope>
</dependency>
- powermock使用
1) mock 公有方法
@RunWith(PowerMockRunner.class)
@PrepareForTest({LearnMocktio.class})
public class LearnMocktioTest {
@Test
public void testAddWithPowerMockito() {
PowerMockito.mockStatic(LearnMocktio.class);
PowerMockito.when(LearnMocktio.add(1,2)).thenReturn(3);
Assert.assertEquals(3,LearnMocktio.add(1,2));
}
}
2) mock 局部变量
@Test
public void getUserCount() {
try{
UserDao userDao = mock(UserDao.class);
whenNew(UserDao.class).withNoArguments().thenReturn(userDao); // 核心mock
PowerMockito.when(userDao.queryUserCount()).thenReturn(10);
UserService userService = new UserService();
assertEquals(10, userService.getUserCount());
}catch (Throwable e) {
fail();
}
}
3) mock final方法
和共有的类似
@Test
public void getUserName() {
UserService userService = PowerMockito.spy(new UserService());
PowerMockito.doReturn("alice").when(userService).getUserName("123");
Assert.assertEquals("alice", userService.getUserName("123"));
}
4) mock 静态方法
@Test
public void getUserCount() throws Exception{
try {
PowerMockito.mockStatic(UserDao.class); // 核心mock
PowerMockito.when(UserDao.queryUserCount()).thenReturn(10);
UserService userService = new UserService();
int result = userService.getUserCount();
assertEquals(10, result);
} catch (Throwable e){
fail();
}
}
5) mock 私有方法
public boolean exist(String userName) {
return checkExist(userName);
}
private boolean checkExist(String userName) {
throw new UnsupportedOperationException();
}
}
@Test
public void exist() throws Exception {
UserService userService = PowerMockito.spy(new UserService());
PowerMockito.doReturn(true).when(userService,"checkExist","123");
Assert.assertTrue(userService.exist("123"));
}
6) mock 构造函数
PowerMockito.whenNew(UserDao.class).withAnyArguments().thenReturn(userDao);
7)Matcher Answer 接口
8) verify
public void saveUser(User user) {
if (userDao.queryUserCount() > 0) {
userDao.updateUser(user);
} else {
userDao.insertUser(user);
}
}
@Test
public void testSaveUser() throws Exception {
UserDao userDao = PowerMockito.mock(UserDao.class);
PowerMockito.whenNew(UserDao.class).withAnyArguments().thenReturn(userDao);
PowerMockito.when(userDao.queryUserCount()).thenReturn(1);
UserService userService = new UserService();
User user = PowerMockito.mock(User.class);
userService.saveUser(user);
Mockito.verify(userDao).updateUser(user);
Mockito.verify(userDao, Mockito.never()).insertUser(user);
}
【 Mockito】
15. 为什么要用mock? --创建一个虚假的对象,打桩验证
- Mockito里的关键知识:
(1) MockitoAnnotations.openMocks(this); --初始化
(2)@Mock 和@Spy 两个注解: @Mock 打桩,不会真正执行; @Spy 会真正执行代码
(3) Mockito.when().thenReturn() 等打桩方法
pom依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.12.4</version>
<scope>test</scope>
</dependency>
</dependencies>
测试方法举例:
public class LearnMocktioTest {
@Spy
private LearnMocktio learnMocktio;
@Test
public void add() {
MockitoAnnotations.openMocks(this);
int add = learnMocktio.add(1, 2);
Assert.assertEquals(3, add);
Mockito.when(learnMocktio.add(1,2)).thenReturn(0);
Assert.assertEquals(0,learnMocktio.add(1,2));
}
}
=================
-
几个重要的注解
-
怎么用mockito写单元测试?
package Biz;
import Client.FileIOClient;
import Req.FileRequest;
import Res.FileResponse;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
/**
* @Author:TieJiang
* @Date: 2021/1/19 8:44 下午
* 人一能之,己十之,人十能之,己百之,果能此道矣,虽愚必明,虽柔必强。
*/
@RunWith(MockitoJUnitRunner.class)
public class FileIOBizTest {
@InjectMocks
FileIOBiz fileIOBiz;
@Mock
FileIOClient fileIOClient;
@Test
public void getFile() {
// Mock阶段
// 构造参数
FileRequest request = new FileRequest();
request.setName("Title");
// Mock Client
when(fileIOClient.FileRead(any())).thenReturn(5);
when(fileIOClient.FileWrite(any())).thenReturn(5);
// Mock结果,进行校验:结果一定是根据现有逻辑能判断出来的
FileResponse response = fileIOBiz.GetFile(request);
Assert.assertNotNull(response);
Assert.assertEquals(response.getValue(),"5 5");
}
}
参考代码:https://github.com/OriKey/MockTutorials/tree/master
- 怎么写SpringRunner的单元测试?
@RunWith(SpringRunner.class) //14.版本之前用的是SpringJUnit4ClassRunner.class
@SpringBootTest(classes = Application.class) //1.4版本之前用的是//@SpringApplicationConfiguration(classes = Application.class)
public class SystemInfoServiceImplTest {
@Autowired
private ISystemInfoService systemInfoservice;
@Test
public void add() throws Exception {
}
@Test
public void findAll() throws Exception {
}
}
pom文件:
<!--spring-test测试=-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>1.5.9.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
参考:
https://blog.youkuaiyun.com/qq_43547991/article/details/119997923
https://blog.youkuaiyun.com/sliping123/article/details/83817737