这种使用场景比较少,但是不失为一种对于注解的深入理解。
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.TYPE, ElementType.METHOD, ElementType.LOCAL_VARIABLE})
public @interface Tag {
/**
* tag 标签
*
* @return tag
*/
String value() default "";
}
设置注解的属性
import com.ryo.jdk.annotation.define.Tag;
import org.junit.Assert;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Map;
public class SetValue {
/**
* 在每一个类执行之前,设置注解的属性
* @throws NoSuchFieldException if any
* @throws IllegalAccessException if any
*/
@SuppressWarnings("unchecked")
public static void beforeClass() throws NoSuchFieldException, IllegalAccessException {
Method[] methods = SetValue.class.getDeclaredMethods();
for(Method method : methods) {
Tag tag = method.getAnnotation(Tag.class);
if(tag != null) {
InvocationHandler h = Proxy.getInvocationHandler(tag);
Field hField = h.getClass().getDeclaredField("memberValues");
hField.setAccessible(true);
Map memberMethods = (Map) hField.get(h);
memberMethods.put("value", "setAnnotation");
String value = tag.value();
Assert.assertEquals("setAnnotation", value);
}
}
}
@Tag
public void tag() {
}
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
beforeClass();
}
}
TestNG 中的 @DataProvider
注解,拥有 dataProvider() 属性用来指定数据源。
编写的框架中 dataProvider() 值可以指向固定的值,但是 TestNG 会通过这个属性来进行值的注入和执行。
编写的框架通过注解去解析对应的配置文件,导致所有的 @DataProvider 的 dataProvider() 可以使固定的。
但是 TestNG 通过判断 dataProvider() 是否有值,来进行参数化测试。
所以,这是一个固定的属性值,使用同一的属性设置,可以使得用户代码变得更加优雅。
import org.testng.Assert;
import org.testng.ITestContext;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Map;
public class TestNgDataProviderTest {
/**
* 是否为空数据准备
* @return 数据
*/
@DataProvider(name = "TestDataProvider")
public Object[][] isEmptyDataProvider(Method method, ITestContext testContext) {
return new Object[][]{
{"", true},
{null, true},
{" ", true},
{"1", false},
{" 1", false}
};
}
/**
* 在每一个类执行之前,设置注解的属性
* @throws NoSuchFieldException if any
* @throws IllegalAccessException if any
*/
@BeforeClass
public void beforeClass() throws NoSuchFieldException, IllegalAccessException {
Method[] methods = this.getClass().getDeclaredMethods();
for(Method method : methods) {
Test test = method.getAnnotation(Test.class);
if(test != null) {
InvocationHandler h = Proxy.getInvocationHandler(test);
Field hField = h.getClass().getDeclaredField("memberValues");
hField.setAccessible(true);
Map memberMethods = (Map) hField.get(h);
memberMethods.put("dataProvider", "TestDataProvider");
String value = test.dataProvider();
Assert.assertEquals("TestDataProvider", value);
}
}
}
@Test
public void isEmptyTest(final String string, boolean result) {
System.out.println(string+","+result);
Assert.assertEquals(result, StringUtil.isEmpty(string));
}
}
annotation 定义与解析
通过反射,动态修改注解的某个属性值
系列导航
Original url: Access
Created at: 2020-03-13 12:13:30
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论