我是靠谱客的博主 懵懂人生,这篇文章主要介绍mockito使用教程 verify校验 assert断言 when thenReturn使用 解决mock静态方法报错 笔记Mockito 三种实现@InjectMocks和@Mock的关系verify的重要用法断言Assert关于when,现在分享给大家,希望可以做个参考。
Mockito 三种实现
1.@RunWith()+@Mock注解实现
@RunWith(MockitoJUnitRunner.class)
public class AccountServiceRunwithTest {
@Mock
private AccountService accountService;
2. @Befor+Mockito.mock
private AccountService accountService;
private List<Integer> mockList;
@Before
public void before() {
accountService = mock(AccountService.class);
mockList = mock(List.class);
}
3.@RunWith + @Rule
@RunWith(JUnit4.class)
public class AccountServiceRulesTest {
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@InjectMocks和@Mock的关系
@InjectMocks:创建类的一个实例,这个实例就是需要测试的实例
@Mock:创建的模拟,模拟的东西会注入到创建的实例类中
verify的重要用法
校验是否调用或调用了几次
verify(mockedList, atLeastOnce()).add("one");
verify(mockedList, times(1)).add("two");
verify(mockedList, times(3)).add("three times");
verify(mockedList, never()).isEmpty();
第一句校验 mockedList.add("one") 至少被调用了 1 次(atLeastOnce)
第二句校验 mockedList.add("two") 被调用了 1 次(times(1))
第三句校验 mockedList.add("three times") 被调用了 3 次(times(3))
第四句校验 mockedList.isEmpty() 从未被调用(never)
参数捕获
verify(mockList).add("1");
当我们验证这个mock的方法add("1")是否被调用,如果被调用则通过测试,否则抛出异常
验证调用顺序
我们可以使用InOrder来验证调用顺序。我们可以跳过任何方法进行验证,但是要验证的方法必须以相同的顺序调用。
InOrder inOrder = inOrder(mockList, mockMap);
inOrder.verify(mockList).add("carpe");
inOrder.verify(mockList, calls(1)).size();
inOrder.verify(mockList).isEmpty();
inOrder.verify(mockMap).isEmpty();
断言Assert
1)assertEquals()方法
判断两个对象是否相等,并返回boolean,int等类型,前为期望值,后为输入值。
assertEquals(返回值,Object expected,Object actual);
2)assertTrue()/assertFalse()
判断测试的对错,condition是期望,message是实际值。
assertTrue(condition,message);
或assertFalse(condition,message);
3)assertArrayEquals()
判断两个数组是否相等
assertArrayEquals(a[],b[]);
关于when
when(…).thenReturn(…) 可以用于控制返回值
Random mockRandom = mock(Random.class);
when(mockRandom.nextInt()).thenReturn(1);
Assert.assertEquals(1, mockRandom.nextInt());
when(…).thenThrow(…) 可以用于控制返回异常
@Test
public void test() {
Random mockRandom = mock(Random.class);
when(mockRandom.nextInt()).thenThrow(new RuntimeException("异常"));
try {
mockRandom.nextInt();
Assert.fail();
// 上面会抛出异常,所以不会走到这里
} catch (Exception ex) {
Assert.assertTrue(ex instanceof RuntimeException);
Assert.assertEquals("异常", ex.getMessage());
}
}
ps :thenReturn和thenThrow都可以返回多个值/异常,请自行补充
当测试void返回类型得方法时 , 就需要用 doThrow来抛出异常
doThrow(new RuntimeException("异常")).when(Service).voidMethod();
Mockito 默认是不支持静态方法
比如我们在 ExampleService 类中定义静态方法 add:
public class ExampleService {
public static int add(int a, int b) {
return a+b;
}
}
尝试给静态方法打桩,会报错:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class MockitoDemo {
@Test
public void test() {
// 会报错
when(ExampleService.add(1, 2)).thenReturn(100);
}
}
可以用 Powermock 弥补 Mockito 缺失的静态方法 mock 功能
在 build.gradle 中配置以下依赖:
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile group: 'org.mockito', name: 'mockito-core', version: '2.25.1'
// PowerMock 相关依赖
testCompile group: 'org.powermock', name: 'powermock-core', version: '2.0.0'
testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.0'
testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.0'
}
示例:
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.mockito.Mockito.*;
@RunWith(PowerMockRunner.class)
// 这是必须的
@PrepareForTest(ExampleService.class)
// 声明要处理 ExampleService
public class MockitoDemo {
@Test
public void test() {
PowerMockito.mockStatic(ExampleService.class);
// 这也是必须的
when(ExampleService.add(1, 2)).thenReturn(100);
Assert.assertEquals(100, ExampleService.add(1, 2));
Assert.assertEquals(0, ExampleService.add(2, 2));
}
}
PowerMockRunner 支持 Mockito 的 @Mock 等注解
上面我们用了 PowerMockRunner ,MockitoJUnitRunner 就不能用了。但不要担心, @Mock 等注解还能用。
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.modules.junit4.PowerMockRunner;
import java.util.Random;
import static org.mockito.Mockito.*;
@RunWith(PowerMockRunner.class)
public class MockitoDemo {
@Mock
private Random random;
@Test
public void test() {
when(random.nextInt()).thenReturn(1);
Assert.assertEquals(1,
random.nextInt());
}
}
最后
以上就是懵懂人生最近收集整理的关于mockito使用教程 verify校验 assert断言 when thenReturn使用 解决mock静态方法报错 笔记Mockito 三种实现@InjectMocks和@Mock的关系verify的重要用法断言Assert关于when的全部内容,更多相关mockito使用教程内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复