`
bingooh
  • 浏览: 53264 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

6.35 使用Annotation替代命名模式

 
阅读更多

一般测试框架类,如JUnit,TestNG都可以通过设置指定具有某些名称的方法为测试方法,如以test开头的方法为测试方法,这样做的缺点包括:

1.如果方法名称拼写错误,不会有任何提示。如误拼为tsetHello(),测试时此方法不会被执行,但是也不会有任何错误提示

 

2.可能误执行其他方法,如testSafety()可能是业务方法,但因为符合测试方法的命名模式(以test开头的方法),所以在测试时会被调用

 

3.不能传递输入参数值给测试方法

 

使用Annotation可以避免以上问题,如以下使用方式:

 

	//使用@Test标记测试方法
	@Test
	public void sayHello(){}
	
	//通过设置@Test的dataProvider指定测试数据提供者
	@Test(dataProvider="dataProvider1")
	public void sayOK(String key,String value){}

 

 

以下简单介绍Annotation的使用。Annotation使用@interface声明,在某些情况下Annotation可视为接口(代替接口的功能),以下为自定义Annotation类:

 

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
	String value() default "OK";
}

 

 

@Documented指定在生成javadoc时,需要同时生成Annotation的帮助文档说明。如果Annotation与业务相关,一般需要生成说明文档

 

@Retention指定Annotation信息的保持策略,目前包含三种策略:SOURCE/CLASS/RUNTIME,分别对应把Annotation信息保持在源码里/编译后的class文件里/运行时加载到JVM里

 

@Target指定Annotation的应用目标,如上例设置为ElementType.METHOD,那么MyAnnotation仅能用于方法(method)上

 

Annotation的方法,如上例的value(),用于指定Annotation的参数值。方法的返回值仅能使用基本数据类型,String,Enum,Class,Annotation类型(包括对应的数组)。如果Annotation仅有一个参数,那么

建议方法名称为“value”。建议使用default指定方法的默认返回值

 

使用反射可获取目标所使用的Annotation,如下:

	@Test
	@MyAnnotation("OK")
	public void testAnnotation() throws Exception{
		Method method=AnnoTest.class.getDeclaredMethod("testAnnotation");
		MyAnnotation myAnnotation=method.getAnnotation(MyAnnotation.class);
		Assert.assertEquals(myAnnotation.value(), "OK");
	}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics