JMockit学习-测试接口调用

最近学习对WEB应用进行单元测试,各层之间的调用通过接口完成;所有bean统一由spring进行管理。尝试实用easymock结合junit进行,发现easymock无法对静态类进行测试,用JMockit替代easymock进行单元测试,完成了对静态类及接口类的测试,总结下对接口测试的过程。

接口及实现类定义
package demo.intf;

import demo.vo.RetVO;

public interface IDemo
{
	public RetVO getInterfaceVal(String para);
}


package demo.impl;

import demo.vo.RetVO;

public class DemoImpl
{
	/**
	 * 返回自定义对象
	 */
	public RetVO getInterfaceVal(String para)
	{
		RetVO ret = new RetVO();
		ret.setValue("loalValue");

		return ret;
	}
}


自定义对象
package demo.vo;

public class RetVO
{
	private String value;

	public String getValue()
	{
		return value;
	}

	public void setValue(String value)
	{
		this.value = value;
	}
}


调用接口进行操作的类
package demo;

import demo.intf.IDemo;
import demo.vo.RetVO;

public class InvokeIntf
{
	//invoke interface
	private IDemo demo;


	//调用接口方法打印接口返回值
	public void printIntfValue()
	{
		RetVO ret = demo.getInterfaceVal("test1");
		System.out.println(ret.getValue());
	}
	
	/**
	 * set 
	 * @param demo
	 */
	public void setDemo(IDemo demo)
	{
		this.demo = demo;
	}
}


测试类
package demo.test;

import mockit.Mock;
import mockit.MockUp;
import mockit.integration.junit4.JMockit;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import demo.InvokeIntf;
import demo.intf.IDemo;
import demo.vo.RetVO;

@SuppressWarnings("deprecation")
@RunWith(JMockit.class)
public class TestInvokeIntf
{
	InvokeIntf testObj = new InvokeIntf();
	
	private IDemo demo;
	
	@Before
	public void beforeClass()
	{
		demo = new MockUp<IDemo>()
		{
			@SuppressWarnings("unused")
			@Mock
			public RetVO getInterfaceVal(String para)
			{
				RetVO ret = new RetVO();
				ret.setValue("replacedValue");
				return ret;
			}
		}.getMockInstance();
		
		testObj.setDemo(demo);
	}
	
	@Test
	public void testPrintIntfValue()
	{
		//观察调用接口方法返回值是否替换
		testObj.printIntfValue();
	}
}


执行后,可以看到打印的结果是替换后的信息。

注意点:
1、最初执行的时候,接口定义的方法调用能够正常被mock,但返回值却始终不是我所期望的,后来发现是因为定义接口对象的时候错误,定义的是mock后的接口对象。所以定义接口对象的时候不需要@Mock,否则接口定义中的所有方法都会被mock掉,如果涉及调用方需要对接口中定义方法的返回值进行处理的,就实现不了。可以对接口中的方法进行Mock,并构造需要的返回值。
2、最初使用jmockit的过程中,执行测试的时候,会提示JVM是否正常启动(使用的是jdk1.5)或者提示错误信息
java.lang.VerifyError: (class: org/junit/runner/notification/RunNotifier, method: addFirstListener signature: (Lorg/junit/runner/notification/RunListener;)V) Illegal constant pool index
怀疑是版本的问题,替换版本后问题解决。
jmockit具体与jdk1.5相关配套的版本还未验证出结果,目前仅仅限于jdk1.6的测试。
3、执行的时候需要添加VM arguments: -javaagent:{path}\jmockit.jar

你可能感兴趣的:(spring,jvm,bean,单元测试,JUnit)