java自定义@Test注解

本文详细介绍如何自定义一个类似于JUnit的@Test注解,用于Java单元测试。文章首先展示了注解的定义,包括其保留策略和目标元素类型,然后演示了如何在测试类中应用此注解,并编写了一个测试运行类来执行这些测试方法。

相信用过 Junit 的朋友都知道 JUnit是Java的一个单元测试框架,在实现自动单元测试的情况下可以大大的提高开发的效率,那么我们如何自定义一个@Test注解呢?

首先,我们先写一个@Test注解,如下:

package annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author Woo_home
 * @create by 2019/9/18
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test {
}

@Test注解类型的声明就是它自身通过Retention和Target注解进行了注解。注解类型声明中的这种注解被称为元注解(meta-annotation)。@Retention(RetentionPolicy.RUNTIME)元注解表明,@Test注解应该在运行时保留。如果没有保留,测试工具就无法知道@Test注解。@Target(ElementType.METHOD)元注解表明,@Test注解只在方法声明中才是合法的:它不能运用到类声明。域声明或者其他程序元素上

在应用中使用@Test注解

package demo;

import annotation.Test;

/**
 * @author Woo_home
 * @create by 2019/9/18
 */
public class TestDemo {

    @Test
    public void hello(){
        System.out.println("Hello World");
    }

}

编写测试运行类

package utils;

import annotation.Test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author Woo_home
 * @create by 2019/9/18
 */
public class RunTests {
    public static void main(String[] args) throws Exception{
        int tests = 0; //记录成功
        int passed = 0;//记录失败
        Class testClass = Class.forName("demo.TestDemo"); //反射带有@Test注解的类
        for (Method m : testClass.getDeclaredMethods()) {
            if (m.isAnnotationPresent(Test.class)){ //Test是定义的注解类,isAnnotationPresent方法告知该工具运行哪些方法
                tests++;
                try {
                    m.invoke(testClass.newInstance()); //通过调用invoke反射式地运行类中所有标注了@Test的方法
                    passed++;
                }catch (InvocationTargetException wrappedExc){
                    Throwable exc = wrappedExc.getCause();
                    System.out.println(m + " failed: " + exc);
                }catch (Exception exc){
                    System.out.println("INVALID @Test: " + m);
                }
            }
        }
        System.out.printf("Passed: %d, Failed: %d%n",tests,tests-passed);
    }
}

我们运行这个类就会打印出标注有@Test注解的方法

但是标注有@Test的类只能用于没有返回值的方法,如果用了有返回值的方法就会报错
,比如:

package demo;

import annotation.Test;

/**
 * @author Woo_home
 * @create by 2019/9/18
 */
public class TestDemo {

    @Test
    public int test1(int i){
        i = 0;
        return i;
    }

    @Test
    public void hello(){
        System.out.println("Hello World");
    }

}

运行测试运行类后会有一个失败
在这里插入图片描述

Java 中,`@Test` 注解是用于标记某个方法为测试方法的一种常见方式,主要用于单元测试中。它广泛应用于多个测试框架中,包括 JUnit 和 TestNG。以下是关于 `@Test` 注解在不同框架中的用法以及相关测试框架的信息。 ### `@Test` 注解在 JUnit 中的用法 JUnit 是 Java 中最常用的单元测试框架之一,特别是在 JUnit 5 中,`@Test` 注解的使用方式更加灵活和标准化。 - **测试类和方法的要求**:测试类必须是 `public`,并且必须提供无参构造器。测试方法必须是 `public`、无返回值(`void`)且不带参数。 - **注解使用**:通过 `@org.junit.jupiter.api.Test` 来标记一个方法为测试方法。 - **示例代码**: ```java import org.junit.jupiter.api.Test; public class CalculatorTest { @Test public void testAddition() { // 测试逻辑 } } ``` 此外,JUnit 5 还支持多种其他注解来管理测试生命周期,例如 `@BeforeEach`、`@AfterEach`、`@BeforeAll` 和 `@AfterAll` [^2]。 ### `@Test` 注解TestNG 中的用法 TestNG 是一个功能更强大的测试框架,它不仅支持单元测试,还支持集成测试、端到端测试等。与 JUnit 不同,TestNG 的 `@Test` 注解更加灵活,允许更多的参数配置。 - **测试方法的要求**:TestNG 支持带参数的测试方法,并且可以返回值,但通常建议保持测试方法无参数。 - **注解使用**:通过 `@org.testng.annotations.Test` 来标记测试方法。 - **示例代码**: ```java import org.testng.annotations.Test; public class SampleTest { @Test public void testMethod() { // 测试逻辑 } } ``` TestNG 的 `@Test` 注解还支持分组、依赖测试、并行执行等功能,这使得它在大型项目中非常有用 [^5]。 ### `@SpringBootTest` 注解的使用 当在 Spring Boot 项目中进行测试时,可以使用 `@SpringBootTest` 注解来启动整个 Spring 上下文,从而进行集成测试。该注解通常与 `@RunWith(SpringRunner.class)` 一起使用(在 JUnit 4 中)或直接与 JUnit 5 的扩展模型结合使用。 - **示例代码**: ```java import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class ApplicationTests { @Test public void contextLoads() { // 验证上下文是否正确加载 } } ``` `@SpringBootTest` 可以确保测试代码在完整的 Spring 环境中运行,这对于验证配置和集成点非常有用 [^3]。 ### 其他相关注解和测试框架 除了 `@Test` 和 `@SpringBootTest`,还有许多其他有用的测试注解: - **JUnit 5 的扩展功能**:JUnit 5 引入了新的扩展模型(`@ExtendWith`),允许开发者自定义扩展,例如参数解析器、测试实例后处理器等。 - **Mockito**:虽然 Mockito 本身不是测试框架,但它常与 JUnit 或 TestNG 结合使用,以模拟对象并验证行为。 - **AssertJ**:这是一个流式断言库,可以与 JUnit 或 TestNG 一起使用,提供更流畅的断言方式。 ### 总结 `@Test` 注解Java 测试框架中的核心部分,无论是 JUnit 还是 TestNG,它都用于标记测试方法。不同的框架提供了不同的功能和灵活性,开发者可以根据项目需求选择合适的测试框架和工具 [^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值