网站首页 > java教程 正文
在service层,使用mock来测试代码。而不再使用Juint测试
JUint是java单元测试的框架,已经在Eclipse中默认的安装。目前主流的有JUnit3和JUnit4.JUint3中,测试用例需要继承TestCase类,JUint4中,测试用例无需继承TestCase类,只需要使用@Test等注解。
JUint4主要通过注解的方式来识别测试方法。目前支持的主要注解有:
@BeforeClass全局只会执行一次,而且是第一个运行。
@Before在测试方法运行之前运行
@Test测试方法
@After在测试方法运行之后允许
@AfterClass全局只会执行一次,而且是最后一个运行
@Ignore忽略此方法
Juint3和JUint4都提供了一个Assert类。Assert类中定义了很多静态方法来进行断言。
Mockito与JUint不同,并不是单元测试框架。它是用于生成模拟对象或者直接点说,就是“假对象”的工具。
Mock/Stub
Mock和Stub是两种测试代码功能的方法。Mock侧重于对功能的模拟,Stub测重于对功能的测试重现,例如对List接口。Mock会直接对List进行模拟,而Stub会新建一个实现了List的TestList,在其中编写测试的代码。
强烈建议优先选择Mock方式,因为Mock方式下,模拟代码与测试代码放在一起,易读性好,而且扩展性、灵活性都比Stub好。
比较流行的Mock
JMock
EasyMock
Mockito
powermock
其中EasyMcock和Mocking对于Java接口使用接口代理的方式来模拟。对于Java类使用继承的方式来模拟(即会创建一个新的Class类)。Mockito支持spy方式。可以对实例进行模拟。但他们都不能对静态方法和final类进行模拟。
Mockito是一个开源项目。Api相对于EasyMock更友好,与EasyMock不同的是,Mockito没有录制过程,只需要在“运行测试代码”之前对接口进行Stub,即设置方法的返回值或抛出的异常。然后直接运行测试代码。运行期间调用Mock的方法,会返回预先设置的返回值或抛出异常。最后再对测试代码进行验证。
- mport static org.mockito.Mockito.*;
- //创建Mock
- List mockedList = mock(List.class);
- //使用Mock对象
- mockedList.add("one");
- mockedList.clear();
- //验证行为
- verify(mockedList).add("one");
- verify(mockedList).clear();
首先是配置 Mock 对象,、
- List mock = mock( List.class );
- when( mock.get(0) ).thenReturn( 1 );
- assertEquals( "预期返回1", 1, mock.get( 0 ) );
Mockito支持 迭代风格 的返回值设定,
- 第一种方式 when(i.next()).thenReturn("Hello").thenReturn("World");
- 第二种方式 when(i.next()).thenReturn("Hello", "World");
上面的例子等价于:
when(i.next()).thenReturn("Hello");
when(i.next()).thenReturn("World");
第一次调用i.next()将返回”Hello”,第二次的调用会返回”World”。
对 void 方法不返回值,所以不能 when(mock.someMethod()).thenReturn(value) 这样的语法,可以这样
doNothing().when(i).remove();
doThrow(Throwable) 模拟返回异常
doThrow(new RuntimeException()).when(i).remove();
迭代风格 doNothing().doThrow(new RuntimeException()).when(i).remove();,这样,第一次调用remove方法什么都不做,第二次调用抛出RuntimeException异常。
(1)如何将mock的类自动注入到待测类中?
在测试代码中,使用@Inject将service层注入,@Mock注释Mapper。
public class AService {
}
public class AServiceTest extends Test4J{
@Inject(targets= { “ AService” })
@Mock
private AMapper aMapper;
}
- 上一篇: 编写更好的Java单元测试的7个技巧
- 下一篇: 一文读懂如何用Java编写单元测试用例
猜你喜欢
- 2024-10-05 单元测试-(单元测试能发现约80的软件缺陷)
- 2024-10-05 Junit4入门之单元测试Junit介绍(junit4入门之单元测试junit介绍英文)
- 2024-10-05 五分钟技术趣谈 | Java常用的单元测试框架介绍
- 2024-10-05 「SpringBoot」 单元测试利器-Mockito
- 2024-10-05 如何使用Python进行单元测试(python单元测验答案)
- 2024-10-05 如何用TestNG进行java单元测试?(java中的test检测)
- 2024-10-05 干货篇-错过一次 错过一年!单元测试之Junit
- 2024-10-05 万字长文:一文详解单元测试干了什么
- 2024-10-05 一台不容错过的Java单元测试代码“永动机”
- 2024-10-05 新的单元测试工具已到位,Java程序员还不快来尝尝新?
你 发表评论:
欢迎- 最近发表
-
- 你真的会用 Java 中的线程池吗?多个企业级线程池工具类封装实践
- 线程池的实现原理、优点与风险、以及四种线程池实现
- Java线程池ThreadPoolExecutor实现原理剖析
- 深入分析线程池的实现原理(线程池是干嘛的)
- 一文搞懂JAVA线程池工作原理(java线程池的工作流程)
- Java线程池的工作原理(java线程池的实现原理)
- 5分钟读懂C#中TcpClient、TcpListener和Socket三个类的角色
- JVM对象的创建过程(jvm运行过程中创建的对象一般存放在方法区)
- 对象组成与Java内存模型JMM分析(java对象在内存中存储的结构)
- JVM对象内存分配详细过程(栈上分配->TLAB->老年代->Eden区)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)