Mockito常用方法及示例

Mockit是一个开源mock框架,官网:http://mockito.org/,源码:https://github.com/mockito/mockito

要使用Mockit,首先需要在我们工程中引入对应的jar包,对于maven工程而言,需要添加如下依赖项即可:

		<dependency>
			<groupId>org.mockito</groupId>
			<artifactId>mockito-core</artifactId>
			<version>2.0.5-beta</version>
		</dependency>
而在我们实际使用时,为了组织测试case的需要,我们可能还需要testng:

		<dependency>
			<groupId>org.testng</groupId>
			<artifactId>testng</artifactId>
			<version>6.8.8</version>
			<scope>test</scope>
		</dependency>

在进行下面的mock test示例之前,我们先建两个简单的被测类Demo、ParameterClass。

Demo.java:

package com.anlegor.test;

public class Demo {

	private String name ="laowang";
	private int age;

	public Demo(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String speak(String str) {
		return str;
	}
	public String talk(String str)
	{
		return str;
	}
	public String methodNoParameters()
	{
		return name;
	}

	public String methodCustomParameters(ParameterClass parameter,String str)
	{
		return str;
	}

	public String methodHaveChildObj(ParameterClass parameter,String str)
	{
		parameter.childTalk(str);
		return str;

	}
}

ParameterClass.java

package com.anlegor.test;

public class ParameterClass {

	public ParameterClass() {

	}

	public String childTalk(String str)
	{
		return str;
	}

}

我们在进行mock的时候,常见会有如下一些场景:

1、 构造无参函数的返回

	/**
	 * 测试无参数函数mock
	 */
	@Test(priority=0)
	public void testReturnDirect()
	{
		String mocked = "mocked Return";
		Demo demo  = Mockito.mock(Demo.class);
		Mockito.when(demo.methodNoParameters()).thenReturn(mocked);
		Assert.assertEquals(demo.methodNoParameters(), mocked);
	}

2、构造有基本类型作为参数的返回

	/**
	 * 测试任意基本类型参数函数mock
	 */
	@Test(priority=1)
	public void testMethodWithParameter()
	{
		String word= "mocked Return";
		Demo demo =  Mockito.mock(Demo.class);
		Mockito.when(demo.speak(Mockito.anyString())).thenReturn(word);
		Assert.assertEquals(demo.speak("你好"), word);
	}

3、构造有基本类型作为参数,但是只针对特定参数输入才mock返回值

	/**
	 * 测试特定参数mock
	 */
	@Test(priority=2)
	public void testMethodWithSpecificParameter()
	{
		String word= "mocked Return";
		Demo demo =  Mockito.mock(Demo.class);
		Mockito.when(demo.speak(Mockito.matches(".*大爷$"))).thenReturn(word);
		Assert.assertEquals(demo.speak("隔壁李大爷"), word);
	}

4、构造自定义类作为函数参数的返回,这种情况稍微复杂一些,需要实现一个matcher类

	/**
	 * 测试自定义类型参数的mock
	 */
	@Test(priority=3)
	public void testMethodWithCustomParameter()
	{
		String word= "mocked Return";
		Demo demo =  Mockito.mock(Demo.class);
		Mockito.when(demo.methodCustomParameters(Mockito.argThat(new IsParameterClass()),
				Mockito.anyString())).thenReturn(word);
		Assert.assertEquals(demo.methodCustomParameters(new ParameterClass(), "你猜"), word);
	}
	//自定义一个与之匹配的matcher类
	class IsParameterClass extends ArgumentMatcher<ParameterClass> {
	    public boolean matches(Object para) {
	        return para.getClass() == ParameterClass.class;
	    }
	 }

5、构造null返回

	/**
	 * 测试mock的函数返回null
	 */
	@Test(priority=4)
	public void testMethodWithReturnNull()
	{
		String word= "mocked Return";
		Demo demo =  Mockito.mock(Demo.class);
		Mockito.when(demo.speak(Mockito.anyString())).thenReturn(null);
		Assert.assertNotEquals(demo.speak("你猜"), word);
	}

6、构造mock的函数抛出异常,当然我们可以在testng中设置expectedExceptions以显示声明会抛出指定类型的异常,这样该条case执行的时候就会成功

	/**
	 * 测试mock的函数抛出异常
	 */
	@Test(expectedExceptions=org.mockito.exceptions.base.MockitoException.class,priority=5)
	public void testMethodReturnException()
	{
		String word= "mocked Return";
		Demo demo =  Mockito.mock(Demo.class);
		Mockito.when(demo.speak(Mockito.anyString())).thenThrow(new Exception());
		demo.speak("你猜");
	}

7、某些反复调用,我们希望对于每次调用都返回不同的mock值

	/**
	 * 测试mock的不同次调用返回不同的值
	 */
	@Test(priority=6)
	public void testMethodMultiDiffReturn()
	{
		String word= "mocked Return 0";
		String word1= "mocked Return 1";
		Demo demo =  Mockito.mock(Demo.class);
		Mockito.when(demo.speak(Mockito.anyString())).thenReturn(word).thenReturn(word1);
		Assert.assertEquals(demo.speak("你猜"), word);
		Assert.assertEquals(demo.speak("你猜"), word1);
	}

8、验证函数执行是否经过了mock

	/**
	 * 验证方法是否被mock且是否为所执行的参数调用
	 */
	@Test(expectedExceptions= org.mockito.exceptions.misusing.NotAMockException.class,priority=7)
	public void testMockedMethodRun()
	{
		String word= "mocked Return";
		Demo demo =  Mockito.mock(Demo.class);
		Mockito.when(demo.speak(Mockito.anyString())).thenReturn(word);
		Assert.assertEquals(demo.speak("你猜"), word);
		Mockito.verify(demo.speak("你猜"));
		//下面这个参数的方法调用并没有被执行过,所以会抛出NotAMockException的异常
		Mockito.verify(demo.speak("nicai"));
	}

如果对于上面的反复使用Mockito.when***的写法很厌烦的话,就直接静态导入org.mockito.Mockito.*即可。

当然,mockito的作用也不仅仅如上面,更详细的使用可以 参考它很详细的帮助文档:

http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html





  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Mockito本身并不提供自动化生成mock对象的功能,但是可以借助其他工具来实现自动化生成mock对象。其中比较常用的是使用mockito-inline和mockito-extension工具。 1. mockito-inline:是Mockito的一个扩展库,提供了一些实用的内联mock功能。其中之一就是支持自动化生成mock对象,可以通过使用@Mock注解来自动创建mock对象。示例如下: ```java import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) public class ExampleTest { @Mock List<String> mockList; @InjectMocks Example example; @Test public void testExample() { when(mockList.get(0)).thenReturn("mock"); assertEquals("mock", example.testMethod()); } } ``` 在这个示例中,我们使用@Mock注解自动创建了一个List类型的mock对象,并且使用@InjectMocks注解将mock对象注入到Example类中。然后,我们可以像之前一样对mock对象进行配置和测试。 2. mockito-extension:是Mockito的另一个扩展库,提供了更多的功能和选项。其中之一就是支持使用自定义名称来自动化生成mock对象。示例如下: ```java import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.STRICT_STUBS) public class ExampleTest { @Mock(name = "mockList") List<String> mockList; @Test public void testExample() { when(mockList.get(0)).thenReturn("mock"); assertEquals("mock", mockList.get(0)); } } ``` 在这个示例中,我们使用@Mock注解自动创建了一个List类型的mock对象,并指定了名称为"mockList"。然后,我们可以像之前一样对mock对象进行配置和测试。 总之,使用Mockito进行自动化生成mock对象需要借助其他工具或扩展库来实现,但是可以帮助我们更快速方便地进行测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值