java——Junit单元测试、反射、注解

本文介绍了Java中的Junit单元测试的步骤,包括测试类和方法的定义,以及@Test注解的使用。接着,详细讲解了反射的概念,包括获取Class对象的三种方式以及Class对象的主要功能,如获取成员变量、构造方法和方法。最后,探讨了注解的基本概念,其在代码分析、编译检查中的作用,以及JDK预定义和自定义注解的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class Calculator {


    /**
     * 加法
     * @param a
     * @param b
     * @return
     */
    public int add (int a , int b){
        //int i = 3/0;

        return a - b;
    }

    /**
     * 减法
     * @param a
     * @param b
     * @return
     */
    public int sub (int a , int b){
        return a - b;
    }

}
public class CalculatorTest {

    public static void main(String[] args) {

        //创建对象
        Calculator c = new Calculator();
        //调用
       /* int result = c.add(1, 2);
        System.out.println(result);*/

        int result = c.sub(1, 1);
        System.out.println(result);

        String str = "abc";
    }
}

 

Junit使用:白盒测试
    * 步骤:
        1. 定义一个测试类(测试用例)
            * 建议:
                * 测试类名:被测试的类名Test        CalculatorTest
                * 包名:xxx.xxx.xx.test        cn.itcast.test

        2. 定义测试方法:可以独立运行
            * 建议:
                * 方法名:test测试的方法名        testAdd()  
                * 返回值:void
                * 参数列表:空参

        3. 给方法加@Test
        4. 导入junit依赖环境

    * 判定结果:
        * 红色:失败
        * 绿色:成功
        * 一般我们会使用断言操作来处理结果
            * Assert.assertEquals(期望的结果,运算的结果);

    * 补充:
        * @Before:
            * 修饰的方法会在测试方法之前被自动执行
        * @After:
            * 修饰的方法会在测试方法执行之后自动被执行

public class CalculatorTest {
    /**
     * 初始化方法:
     *  用于资源申请,所有测试方法在执行之前都会先执行该方法
     */
    @Before
    public void init(){
        System.out.println("init...");
    }

    /**
     * 释放资源方法:
     *  在所有测试方法执行完后,都会自动执行该方法
     */
    @After
    public void close(){
        System.out.println("close...");
    }


    /**
     * 测试add方法
     */
    @Test
    public void testAdd(){
       // System.out.println("我被执行了");
        //1.创建计算器对象
        System.out.println("testAdd...");
        Calculator c  = new Calculator();
        //2.调用add方法
        int result = c.add(1, 2);
        //System.out.println(result);

        //3.断言  我断言这个结果是3
        Assert.assertEquals(3,result);

    }

    @Test
    public void testSub(){
        //1.创建计算器对象
        Calculator c  = new Calculator();
        int result = c.sub(1, 2);
        System.out.println("testSub....");
        Assert.assertEquals(-1,result);
    }
}

反射:框架设计的灵魂

* 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码
* 反射:将类的各个组成部分封装为其他对象,这就是反射机制
	* 好处:
		1. 可以在程序运行过程中,操作这些对象。
		2. 可以解耦,提高程序的可扩展性。

* 获取Class对象的方式:
    1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
        * 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
    2. 类名.class:通过类名的属性class获取
        * 多用于参数的传递
    3. 对象.getClass():getClass()方法在Object类中定义着。
        * 多用于对象的获取字节码的方式

    * 结论:
        同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

public class Person {
    private String name;
    private int age;

    public String a;
    protected String b;
    String c;
    private String d;


    public Person() {
    }

    public Person(String name, int age) {

        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", a='" + a + '\'' +
                ", b='" &
### 如何运行 JUnit 单元测试 #### 使用 IDE 运行 JUnit 测试 几乎所有的集成开发环境(IDE)都集成了 JUnit,允许开发者直接在 IDE 中编写并运行 JUnit 测试。这意味着可以在支持 Java 的大多数主流编辑器内轻松地创建、管理和执行测试案例[^1]。 对于 Eclipse 或 IntelliJ IDEA 用户来说,只需右键点击想要运行的测试类或特定测试方法,然后选择 "Run As" -> "JUnit Test" 来启动测试流程。IDE 将自动处理实例化测试用例、调用 `@Before` 和 `@After` 方法以及实际的 `@Test` 方法,并展示结果给用户[^2]。 #### 利用 Maven 执行 JUnit 测试 为了通过命令行或者持续集成管道来触发这些测试,通常会采用构建工具如 Apache Maven。Maven 提供了一个简便的方式来进行自动化编译和测试工作流管理。要使 Maven 能够识别并执行 JUnit 测试,需确保项目的 pom.xml 文件里包含了必要的依赖项配置: ```xml <dependencies> <!-- 其他依赖 --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.x.x</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.x.x</version> <scope>test</scope> </dependency> <!-- 更多可能需要的插件/库 --> </dependencies> ``` 完成上述设置之后,可以通过简单的命令 `mvn test` 来让 Maven 自动寻找所有标记为测试性质的源码文件——通常是位于 src/test/java 下面那些带有 @Test 注解的方法所在的类——接着依次对其进行初始化、前置条件准备(`@BeforeEach`)、核心逻辑验证(@Test),最后清理资源(`@AfterEach`)的操作序列[^4]。 #### 创建自定义注解进行单元测试 如果希望模仿标准的 `@Test` 行为而设计自己的注解,则涉及到了更深层次的理解和技术应用。这包括但不限于定义新的注解类型及其属性,确保其能够在运行时期间被访问(即指定 RetentionPolicy.RUNTIME),并通过反射技术动态加载目标方法并执行它们。下面是一个简化版的例子说明如何实现这一点: 1. **定义自定义注解** ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyTest {} ``` 2. **编写待测业务逻辑和服务层接口** 3. **建立包含多个带 `@MyTest` 标记函数的服务实现类** ```java public class ServiceImpl { @MyTest public void serviceMethodOne(){ System.out.println("Service Method One Executed"); } @MyTest public void serviceMethodTwo(){ System.out.println("Service Method Two Executed"); } // More methods... } ``` 4. **构造驱动程序以查找并调用所有标注了 `@MyTest` 的成员函数** ```java import java.lang.reflect.Method; public class Runner { private static final String TEST_CLASS_NAME = "ServiceImpl"; public static void main(String[] args)throws Exception{ Class<?> clazz = Class.forName(TEST_CLASS_NAME); Object instance = clazz.getDeclaredConstructor().newInstance(); for(Method method :clazz.getMethods()){ if(method.isAnnotationPresent(MyTest.class)){ method.invoke(instance); } } } } ``` 当以上代码被执行时,将会打印出两个服务方法的日志信息,表明这两个方法确实因为携带了 `@MyTest` 注解而在运行期间得到了正确调用[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放牛娃@搞IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值