Mockitoの常用方法及び例

5522 ワード

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>
私達が実際に使っている時、テストケースを組織するために、testingが必要かもしれません。
		<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;

	}
}
Parameter Class.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
	 */
	@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の関数は異常を投げます。もちろん、testingに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