您如何测试通用API的类型安全性?

pol*_*nts 5 java generics testing api type-safety

您可以使用例如JUnit来测试库的功能,但是如何测试其在泛型和通配符方面的类型安全性?

只针对编译的代码进行测试是一种"快乐路径"测试; 您是否也应该针对非类型安全的用法测试您的API并确认这些代码不编译?

   // how do you write and verify these kinds of "tests"?

    List<Number> numbers = new ArrayList<Number>();
    List<Object> objects = new ArrayList<Object>();

    objects.addAll(numbers); // expect: this compiles

    numbers.addAll(objects); // expect: this does not compile
Run Code Online (Sandbox Code Playgroud)

那么如何验证您的通用API在编译时引发了正确的错误?您是否只是构建一个非编译代码来测试您的库,并将编译错误视为测试成功,反之亦然?(当然你必须确认错误是与泛型相关的).

是否有促进此类测试的框架?

Boz*_*zho 6

由于这不是传统意义上的测试(即 - 你不能"运行"测试),我不认为这样的工具存在,这就是我的建议:

  1. 定期进行单元测试
  2. 在其中生成代码 - 正确的代码和错误的代码
  3. 使用Java编译器API尝试编译它并检查结果

您可以为该功能制作一个易于使用的包装器,并为符合您要求的任何人提供帮助.


Moe*_*tar 5

听起来您正在尝试测试Java编译器,以确保在分配错误类型时(而不是测试您自己的api)会引发正确的编译错误.

如果是这种情况,为什么你不关心编译器在将Integers分配给String字段时没有失败,以及当你在尚未初始化的对象上调用方法时,以及编译器应该检查的其他数百万个其他事情时他们编译代码?!