大家好, 这里是K字的研究, 一个Java程序员的日常分享.
今天, 分享一个Junit 5 注解
@ConvertWith
的使用.
前几天在《1.5分钟学会用Junit参数化测试》 中介绍了,怎么自定义 Junit 5 参数注解, 并实现了一个@JSONSource
注解.
@ParameterizedTest
@JSONSource(value = "pojo.json", type = A. class )
void pojo ( A a ) {
log.info("data {}", a);
assertNotNull(a);
assertEquals(a.a+a.b, a.c);
}
有没有发现一个问题, 下面的参数里写了A
, 上面的注解里还写了个A.class
.
古人云, DRY.
这里的重复,是我的问题.因为当时不知道 Junit 提供了更优雅的解决方案, @ConvertWith
.
用了@ConvertWith 的代码
@ConvertWith
用法如下:
@ParameterizedTest
@ValueSource(strings = {"pojo.json","b.json"})
void pojo(@ConvertWith(JSONConverter.class) A a) {
System.out.println("a = " + a);
}
这里只需要自己实现一个ArgumentConverter类型,通过注解添加到参数上. Junit 在转换参数时候, 会自动读取注解里配置的转换器, 转换成对应类型.
ArgumentConverter 写法
public class JSONConverter implements ArgumentConverter {
@Override
public Object convert(Object source, ParameterContext context) throws ArgumentConversionException {
String content = FileUtil.readString(String.valueOf(source), StandardCharsets.UTF_8);
return JSON.parseObject(content,context.getParameter().getType());
}
}
当然,这里可以自由发挥.除了读取文件, 按照json格式转为对象,也可以读取文件, 按照xml格式反序列化为对象没啥本质区别. 甚至读取文件内容, 做一个md5值传下去, 也是可以的.
显式转换 VS 隐式转换
前面的写法, 手动给参数加上 @ConvertWith
, 属于一种显式转换(Explicit Convert)
, 注解加来加去也挺烦的. Junit 自身, 也提供了隐式转换(impilicit Convert)
的能力.
@Data
public class A {
public static A aStaticFactoryMethod(String a){
///
}
// or
public A (String a){
///
}
// ...
}
如果目标类, 本身有一个以String为参数的静态工厂方法,或者String为参数的构造器, 那他自动享受转换待遇, 不需要手动去添加Converter注解.
除此之外, 普通的包装类型, 基础类型,时间, 货币等等, 都可以享受同等的隐式转换待遇.
Provider VS Converter
相较于上一篇提到的Method
级别自定义ArgumentsProvider
, 自定义ArgumentConverter
更加的灵活, 作用域也更小, 更适用于精细化的操作.
看一下, 万一你喜欢用呢?
后话
最近有点忙的脚不沾地, 就更新慢了..日常分享都快变月常了.
Junit其实还有很多好玩的东西可以写, 我回头再找补吧. 咱们下次更新再见.
原文始发于微信公众号(K字的研究):30秒学会Junit自定义参数转换
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/29679.html