30秒学会Junit自定义参数转换

大家好, 这里是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.classA 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其实还有很多好玩的东西可以写, 我回头再找补吧. 咱们下次更新再见.

30秒学会Junit自定义参数转换


原文始发于微信公众号(K字的研究):30秒学会Junit自定义参数转换

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/29679.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!