合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
### 在 @Unit 中使用泛型 泛型为 **@Unit** 出了一个难题,因为我们不可能“通用测试”。我们必须针对某个特定类型的参数或者参数集才能进行测试。解决方法十分简单,让测试类继承自泛型类的一个特定版本即可: 下面是一个 **stack** 的简单实现: ```java // annotations/StackL.java // A stack built on a LinkedList package annotations; import java.util.*; public class StackL<T> { private LinkedList<T> list = new LinkedList<>(); public void push(T v) { list.addFirst(v); } public T top() { return list.getFirst(); } public T pop() { return list.removeFirst(); } } ``` 为了测试 String 版本,我们直接让测试类继承一个 Stack\<String\> : ```java // annotations/StackLStringTst.java // Applying @Unit to generics // {java onjava.atunit.AtUnit // build/classes/main/annotations/StackLStringTst.class} package annotations; import onjava.atunit.*; import onjava.*; public class StackLStringTst extends StackL<String> { @Test void tPush() { push("one"); assert top().equals("one"); push("two"); assert top().equals("two"); } @Test void tPop() { push("one"); push("two"); assert pop().equals("two"); assert pop().equals("one"); } @Test void tTop() { push("A"); push("B"); assert top().equals("B"); assert top().equals("B"); } } ``` 输出为: ```java annotations.StackLStringTst . tTop . tPush . tPop OK (3 tests) ``` 这种方法存在的唯一缺点是,继承使我们失去了访问被测试的类中 **private** 方法的能力。这对你非常重要,那你要么把 private 方法变为 **protected**,要么添加一个非 **private** 的 **@TestProperty** 方法,由它来调用 **private** 方法(稍后我们会看到,**AtUnitRemover** 会删除产品中的 **@TestProperty** 方法)。 **@Unit** 搜索那些包含合适注解的类文件,然后运行 **@Test** 方法。我的主要目标就是让 **@Unit** 测试系统尽可能的透明,使得人们使用它的时候只需要添加 **@Test** 注解,而不需要特殊的编码和知识(现在版本的 **JUnit** 符合这个实践)。不过,如果说编写测试不会遇到任何困难,也不太可能,因此 **@Unit** 会尽量让这些困难变的微不足道,希望通过这种方式,你们会更乐意编写测试。