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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值