最近学习对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
分享到:
相关推荐
2. **验证(Verification)**:在测试过程中,JMockit提供了验证功能,确保被测代码调用了预期的方法或满足了特定条件。这有助于检测代码中可能存在的问题,如未调用的依赖方法或错误的参数值。 3. **记录与重放...
4. **执行测试**:调用被测试代码,JMockit会自动应用之前定义的模拟行为。 5. **验证结果**:测试完成后,可以通过断言(如JUnit的`assertEquals`)来验证预期的结果是否与实际相符。 **实例解析** 下面是一个...
JMockit是一个流行的Java测试工具,它主要用于模拟和断言对象的行为,特别是在进行单元测试时。这个工具使得开发者能够在不修改源代码的情况下,对复杂的依赖关系进行模拟,从而简化测试过程。下面将详细介绍JMockit...
通过学习和实践这个压缩包中的示例代码,你将能深入了解JMockit的功能和用法,提升你的Java单元测试技能。记得,理论知识与实践相结合是掌握技术的关键,不断练习和应用这些示例,你将能够在实际工作中更加自如地...
JMockit是一款用于Java应用程序的高级单元测试框架,它提供了丰富的API来帮助开发者创建高质量的单元测试。JMockit的核心能力在于其能够模拟(Mock)和伪装(Stub)Java类中的方法,从而使得开发者能够在隔离环境中...
压缩包中的`MockTest`很可能是一个包含JMockit测试用例的类。这个类可能展示了如何设置模拟对象,定义期望,执行测试,并验证模拟行为。它可能包含了对静态方法的模拟,以展示如何在测试中控制静态行为。 5. **...
2. **Mock接口(Interface)**:可以模拟任何接口的行为,包括其所有方法的调用。 3. **Mock枚举(Enum)**:枚举类型也可以被模拟,这在处理依赖于特定枚举值的场景时非常有用。 4. **Mock注解(Annotation)**:...
// 被测试方法会调用接口方法 String actualResult = testedClass.methodUsingInterface(myInterface); assertEquals("mocked response", actualResult); } ``` ### 6. 结合使用Jmockit进行实际测试 在`...
5. **最佳实践和技巧**:如何编写简洁、可读性强且高效的Jmockit测试代码。 6. **常见问题和解决方案**:面对测试中的挑战,如循环依赖、多线程环境下的模拟等,Jmockit如何应对。 通过深入学习和实践,开发者可以...
JMockit的核心功能是允许开发者在单元测试中模拟任何Java类或接口的行为,包括静态方法、构造函数、final类和方法,以及系统类。通过模拟,我们可以隔离被测试代码,消除外部依赖,从而进行更纯净、更可控的测试。 ...
本资源包含了四个不同模拟框架的源码:Easymock、JMockit、Mockito和PowerMock,这些都是Java语言中广受欢迎的单元测试工具。下面将对这四个框架进行详细介绍。 1. **Easymock**: Easymock是一个简单的模拟框架,...
它允许我们为接口创建代理对象,该对象可以拦截并处理方法调用,例如在调用真实方法前执行额外的逻辑。 3. **jMockit**:是一个强大的Java测试框架,提供模拟对象和动态代理功能,使测试变得更灵活和全面。在测试中...
8. **使用场景**:CGlib不仅适用于Spring AOP,还广泛应用于其他领域,如ORM框架(Hibernate)、单元测试工具(JMockit)、数据访问对象(DAO)的实现等。 总的来说,CGlib-2.2.jar是一个强大且实用的库,它简化了Java...
PowerMock与其他Mocking工具(如Mockito、JMockit)相比,它的优势在于能够处理更多复杂的模拟场景,但也因为其强大的能力,学习曲线相对较陡峭。在选择Mocking工具时,应根据项目的实际需求和团队的熟悉程度来决定...
#SpringWeb应用程序该项目旨在成为 Spring MVC 中简单 Web 应用程序的规范示例。 这里没有服务或 dao 层,只有具有 CSS/JS 表示层支持的 JSP 和控制器前端。 该项目展示了以下内容: 使用...JMockit 进行单元测试启动服
Mocking允许开发者创建模拟对象,这些对象的行为和接口与实际的对象相同,但可以被精确控制以满足测试需求。这样做的好处是可以隔离测试,确保测试只关注待验证的代码,而不是整个系统。Mock对象可以预设返回值、抛...
5. **数据模拟**:项目名称中的“Sim”可能意味着它包含数据模拟功能,可能使用随机数生成器、模拟算法或者数据生成库如Apache Commons Lang或JMockit。 6. **日志记录**:为了调试和监控,项目很可能使用了日志...
而只创建一个表示层和一个应用程序层: 看法表示层,负责为用户提供命令行界面,并实现有助于解释来自控制台的命令以调用应用程序层的功能应用负责实现REST客户端并为表示层的使用提供应用程序接口的层。用该程序将...
在“pfnomock”项目中,很可能包含了一些测试,这些测试使用模拟技术来代替实际的银行接口,从而可以专注于验证转账函数的逻辑是否正确,而不必关心真实银行接口的实现细节。通过这种方式,测试变得更加快速、可控,...