EasyMock验证

时间:2020-02-23 14:41:19  来源:igfitidea点击:

EasyMock Verify方法用于验证是否调用了所有存根方法,并且在模拟对象上没有意外调用。

EasyMock验证

EasyMock verify()方法具有与调用verifyRecording(Object)verifyUnexpectedCalls(Object)方法相同的效果。

让我们看一下EasyMock verify()方法的简单示例。

package com.theitroad.easymock;

import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.mock;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.ArrayList;

import org.junit.jupiter.api.Test;

public class EasyMockVerifyExample {

	@Test
	public void test() {
		ArrayList<Integer> mockList = mock(ArrayList.class);
		expect(mockList.add(10)).andReturn(true);
		expect(mockList.add(20)).andReturn(true);
		expect(mockList.size()).andReturn(2);
		expect(mockList.get(0)).andReturn(10);
		replay(mockList);

		mockList.add(10);
		mockList.add(20);
		assertTrue(mockList.get(0) == 10);
		assertEquals(mockList.size(), 2);

		verify(mockList);
	}
}

注意,所有存根方法都在replay()方法之后被调用。

如果我们不调用存根方法怎么办?

它将引发AssertionError。
例如,如果我注释" mockList.add(10)"语句,那么下面的异常堆栈跟踪将由JUnit报告。

java.lang.AssertionError: 
Expectation failure on verify:
  ArrayList.add(10 (int)): expected: 1, actual: 0
	at org.easymock.internal.MocksControl.verify(MocksControl.java:284)
	at org.easymock.EasyMock.verify(EasyMock.java:2041)
	at com.theitroad.easymock.EasyMockVerifyExample.test(EasyMockVerifyExample.java:31)

EasyMock使用Nice Mock验证意外呼叫

如果模拟对象是一个不错的模拟对象,那么verify()方法将不会因意外的方法调用而引发错误。
但是,如果未调用存根调用,它将引发错误。

下面的测试代码片段将以绿色传递,因为模拟对象是不错的模拟对象。

ArrayList<Integer> mockList = mock(MockType.NICE, ArrayList.class);
replay(mockList);
mockList.add(10); //unexpected method call
verify(mockList);

EasyMock verify()复杂示例

我们可以将EasyMock verify()方法移至@After方法,以确保调用了所有存根方法。

package com.theitroad.easymock;

import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.mock;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.ArrayList;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class EasyMockVerifyRealExample {

	ArrayList<Integer> mockList;

	@BeforeEach
	public void setup() {
		mockList = mock(ArrayList.class);
	}

	@Test
	public void test() {
		expect(mockList.add(10)).andReturn(true);
		expect(mockList.get(0)).andReturn(10);
		replay(mockList);

		mockList.add(10);
		assertTrue(mockList.get(0) == 10);
	}

	@AfterEach
	public void teardown() {
		verify(mockList);
	}

}