发布时间:2024-11-07 10:01
最近一段时间在给写的框架补单元测试。发现有一些方法做单元测试不好做,主要是其内部依赖了许多外部环境,如Zookeeper、DB、Http请求等等。
如果为了这些单元测试单独去搞一套环境,很是费事。再者代码每天在Jenkins上跑单元测试,环境不一定相通。
假设我们有下面这样一个类,其中的isAdmin
方法主要是从redis中获取数据,然后进行对比判断。现实中,这里可能有很多复杂的逻辑,这里只做抛砖引玉。
public class RedisDemo {
private Jedis jedis;
public void setUp() {
jedis = new Jedis("127.0.0.1", 6379);
jedis.connect();
}
public boolean isAdmin(String user) {
String ret = jedis.get("name");
if (ret.equals(user)) {
return true;
}
return false;
}
public static void main(String[] args) {
RedisDemo demo = new RedisDemo();
demo.setUp("127.0.0.1", 6379);
boolean isAdmin = demo.isAdmin("test");
System.out.println(isAdmin);
}
}
@Test
public void test() {
RedisDemo redisDemo = new RedisDemo();
redisDemo.setUp("127.0.0.1", 6379);
Assert.assertSame(true, redisDemo.isAdmin("admin"));
}
我们通常使用上述的代码对其进行单元测试,看似简单。但是需要我们搭建一套redis环境,并且初始化数据。如果只有redis还好,假如项目中依赖的外部环境有ZK、redis、MySQL、http还有其他部门的一些接口,在这样做的话,其他不说,光维护这一套环境就很麻烦了。
那应该怎么简化操作呢?继续向下看。
<dependencies>
<dependency>
<groupId>org.mockitogroupId>
<artifactId>mockito-allartifactId>
<version>1.8.5version>
<scope>testscope>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
dependencies>
public class RedisTest {
@Rule
public ExpectedException exception = ExpectedException.none(); // 不允许有异常
@Test
public void mockTest() throws Exception {
Jedis mockJedis = Mockito.mock(Jedis.class);
Mockito.when(mockJedis.get("name")).thenReturn("admin");
RedisDemo redisDemo = new RedisDemo();
Field daoField = redisDemo.getClass().getDeclaredField("jedis");
daoField.setAccessible(true);
daoField.set(redisDemo, mockJedis);
Assert.assertSame(true, redisDemo.isAdmin("admin"));
}
}
这里使用了Mockito.mock()
这个API进行Mock,当程序调用jedis的方法时,并不会真正触发jedis的方法,而是返回一个设定的值。
本文只是对这个模块构造很复杂的测试,分享了一个工具。当然,Mockito的功能不仅仅如此,更详细的文档请参考:
https://static.javadoc.io/org.mockito/mockito-core/2.11.0/org/mockito/Mockito.html
MindSpore易点通·精讲系列--数据集加载之CSVDataset
centos8替代linux,CentOS 8即将消亡,创始人发布Rocky Linux替代新项目
SAP 自定义搜索帮助在ALV和TABLE CONTROL里实现关联搜索
R语言主成分pca、因子分析、聚类对地区经济研究分析重庆市经济指标
Nginx反向代理WebSocket服务连接报错:WebSocket connection to “wss://xxx/xxx“ failed
记录Chrome插件从V2版本升级到V3版本的过程中遇到的问题
竟然有一半的人不知道 for 与 foreach 的区别???
JavaScript_牛客网_编程初学者入门训练(131-140题解)
中国(温州)数安港“2022数据智能夏令营”开营!开启最酷夏日体验