读书笔记 -- Junit 实战(3rd)Ch03 Junit 的体系机构

3.1 体系结构

软件体系结构:软件系统的基本结构。包括 软件元素、元素之间的关系、元素和关系的属性。

3.2 JUnit4 的体系结构

1. JUnit4 运行器:一个扩展了 Runner 抽象类的类,负责运行 JUnit 测试。JUnit4 的所有功能都在一个 JAR 文件中,但可以通过反射来扩展。

    实践中,可以用现有的运行器,如 Spring 框架的运行器,或 Mockito 模拟对象的运行器。

     JUnit4 添加自定义功能的方法:扩展 JUnit4 的抽象类 Runner,覆盖其方法并使用反射。

// 关于反射的一个说明:

在Java中,Method.invoke()方法是Java反射API的一部分。这个方法用于调用一个对象的方法。这是一个非常强大的工具,因为它可以在运行时动态地调用类的方法,即使这个类是在编译时未知的。 Method.invoke()方法的基本形式如下:   
public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
其中:   obj:要调用方法的对象。如果方法是一个静态方法,则此对象可以为null。   args:传递给方法的参数列表。如果方法没有参数,则此数组可以为空。   Method.invoke()方法返回一个对象,这是调用方法的返回值。如果方法没有返回值(即其返回类型为void),则此方法返回null。 这是一个例子:
import java.lang.reflect.*; public class Test { public static void main(String[] args) { try { // 获取一个对象,该对象是"Hello World"类的实例 Object obj = new String("Hello World"); // 获取String类的println方法 Method method = String.class.getMethod("println"); // 调用println方法 method.invoke(obj); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } 在这个例子中,我们创建了一个String对象,并使用反射调用了它的println方法。注意,尽管这个方法在String类中并没有明确定义,但是我们仍然可以调用它,因为它是Object类的一部分。这就是反射的强大之处——它可以让我们在运行时动态地调用任何类的方法,
无论这个类在编译时是否已知。

2. JUnit4 规则:拦截测试方法调用的组件,允许你在测试方法运行前做些事情,测试方法后做些事情(JUnit4 特有)。要添加行为,需要在 TestRule 字段上用 @Rule 注解。

3.3 JUnit5 的体系结构

      

JUnit Platform:Junit 在 JVM 中启动测试框架的基础。此模块还提供了从控制台、IDE或构建工具启动测试的 API。

Junit Jupiter:结合了新的编程模型(注解、类和方法)和扩展模型,在 Junit 5 中用于编写测试和扩展。

Junit Vintage:用于兼容运行 Junit 3 和 Junit 4 的测试。

 

posted on 2023-11-07 08:59  bruce_he  阅读(13)  评论(0编辑  收藏  举报