`

JunitRunner定制之模仿@Before对属性进行初始化

    博客分类:
  • Test
阅读更多
在测试的过程中, 会用到一些模拟数据, 希望在每次调用测试方法之间对这些数据进行一下初始化,类似@Before注解的方法, 在调用测试方法之间被调用一次, 我希望通过注解来做这件事儿.于是有了下面的做法:
通过阅读JUnit4ClassRunner源代码, 发现在createTest()方法中做这件事比较合适:
@Override
	protected Object createTest() throws Exception {
		Object testObject = super.createTest();
		// 找出所有带有@FieldBefore注解的属性
		List<Field> fields = getFieldBefores();
		for (Field field : fields) {
                        // 必须设置为true, 否则调用后一句会抛异常
			field.setAccessible(true);
			field.set(testObject, field.getType().newInstance());
		}
		return testObject;
	}

参照查找@Before 注解的方法的代码, 查找所有带@FieldBefore的方法:
public List<Field> getFieldBefores() {
		List<Field> results = new ArrayList<Field>();
		for (Class<?> eachClass : getSuperClasses(getTestClass().getJavaClass())) {
			Field[] fields = eachClass.getDeclaredFields();
			for (Field field : fields) {
				Annotation annotation = field.getAnnotation(FieldBefore.class);
				if (annotation != null && !isShadowed(field, results))
					results.add(field);
			}
		}
		Collections.reverse(results);
		return results;
	}

	private List<Class<?>> getSuperClasses(Class<?> testClass) {
		ArrayList<Class<?>> results = new ArrayList<Class<?>>();
		Class<?> current = testClass;
		while (current != null) {
			results.add(current);
			current = current.getSuperclass();
		}
		return results;
	}

	private boolean isShadowed(Field field, List<Field> results) {
		for (Field each : results) {
			if (isShadowed(field, each))
				return true;
		}
		return false;
	}

	private boolean isShadowed(Field current, Field previous) {
		if (!previous.getName().equals(current.getName()))
			return false;
		return true;
	}

最后是@FieldBefore的定义:
/**
 * 在每次执行方法前, 对属性执行初始化
 * @author xxx
 * @since 2009-2-12 下午07:31:03
 */
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.FIELD })
public @interface FieldBefore {
}


用法如下:
public class Mock {
	public String str;
	public Mock() {
		str = "init";
	}
}
public class MockBeforeTest {
	@FieldBefore
	private static Mock mock;
	// override the super field annotation init
	private static Mock mock1;
	
	@Test
	public void testModth() {
		Assert.assertNull(mock1);
		System.out.println(mock.str);
		Assert.assertNotNull(mock);
		Assert.assertEquals(mock.str, "init");
	}
}
分享到:
评论

相关推荐

    junitrunner-spring-0.0.2.zip

    【junitrunner-spring-0.0.2.zip】是一个开源项目,主要目的是为了整合JUnit测试框架和Spring框架,提供一个全面的解决方案,使得开发者可以在同一个测试用例中灵活地利用两个框架的优点。这个压缩包包含的是名为...

    Junit_test.rar_JUnit_JUnit测试_junit工具 @test

    4. **测试注解的扩展**:除了基本的`@Test`,JUnit还提供了其他注解,如`@Before`和`@After`,分别在每个测试方法之前和之后执行,常用于初始化和清理工作。`@BeforeClass`和`@AfterClass`则在整个测试类的生命周期...

    浅谈spring-boot的单元测试中,@Before不被执行的原因

    在JUnit 4.x版本中,@Before用于在每个测试方法执行前执行一些初始化操作。但是,在JUnit 5.x版本中,该注解被@BeforeEach所取代。 在Spring Boot单元测试中,我们需要使用@BeforeEach来代替@Before,以便在每个测试...

    面试官:Spring 注解 @After,@Around,@Before 的执行顺序是?.zip

    面试官:Spring 注解 @After,@Around,@Before 的执行顺序是?.zip 面试官:Spring 注解 @After,@Around,@Before 的执行顺序是?.zip 面试官:Spring 注解 @After,@Around,@Before 的执行顺序是?.zip 面试官:...

    Spring_AOP_before.rar_AOP@before怎么用_Before

    `@Before`注解常用于日志记录、安全检查、事务初始化等场景。例如,在用户登录之前检查其权限,或者在数据库操作之前开启事务。 总结,`@Before`注解是Spring AOP提供的一种强大机制,它使得我们能够在不修改原始...

    CSS样式初始化commonInitialize.css

    在网页设计中,CSS(Cascading Style Sheets)样式被广泛用于定义页面元素的外观、布局和结构。CSS样式初始化是开发...在实际项目中,开发者可以根据项目需求调整和定制这个初始化文件,以满足特定的设计和功能要求。

    junit4.4

    其次,JUnit 4.4 提供了参数化测试功能,允许测试方法接受一组参数并进行多次执行。通过 `@Parameters` 注解和一个返回值为 Collection 的静态方法,我们可以定义测试数据集。这种方法对于测试多输入条件或边界情况...

    如何在Spring Boot中使用@Before注解

    `@Before`注解是Spring AOP的一部分,用于定义一个前置通知(Before advice),即在目标方法执行之前执行的代码片段。 在上述例子中,我们首先创建了一个Spring Boot项目,并引入了Web和AOP相关的依赖。接着,我们...

    junit4.9.jar 最新版本

    @Before:在每一个测试方法执行前执行的方法,用于初始化方法 @After:在第一个测试方法执行后执行的方法,用于释放资源 @Test:标志该方法为测试方法,在此可以测试期望异常和超时时间 @Ignore:标志该方法为忽略...

    junit4学习文档

    使用 `@Before` 和 `@After` 注解分别进行测试前后的初始化和清理工作。通过 `@Test` 注解来指定 `add` 方法为测试方法,并使用 `assertEquals` 断言来验证测试结果是否符合预期。 ### 总结 JUnit4 通过引入注解...

    Junit4简单实用

    这两个元数据主要用于设置测试前后的环境,例如初始化数据或者清理资源。在 JUnit 3 中,这些功能是通过 `setUp` 和 `tearDown` 方法实现的,但在 JUnit 4 中,它们被 `@Before` 和 `@After` 注解替代,使得代码更...

    Junit简介和扩展

    JUnit主要用于程序员进行白盒测试,即通过对程序内部逻辑结构的深入理解来进行测试。 **特性**: - **断言(Assertion)**:用于验证测试结果是否符合预期。 - **测试工具**:提供一系列工具帮助共享测试数据。 - ...

    Java单元测试JUnit4.7

    1. **注解(Annotations)**:JUnit 4.7的一大亮点就是使用注解(@Test, @Before, @After等)来标记测试方法、设置初始化和清理操作。这使得测试类的结构更清晰,代码更易读。 2. **参数化测试**:允许用不同的参数...

    JUnit5 User Guide

    测试实例生命周期管理允许对测试的生命周期事件进行控制,比如可以在测试执行之前和之后进行一些初始化和清理操作。 嵌套测试、构造函数和方法的依赖注入、测试接口和默认方法等特性,使得JUnit5的测试类可以更加...

    Junit API 4.9

    JUnit是Java编程语言中最常用的单元测试框架之一,它极大地简化了对代码进行验证和调试的过程。Junit API 4.9是该框架的一个版本,它提供了丰富的功能来帮助开发者编写和执行测试用例。在这一版本中,JUnit引入了...

    MyBatis 需要注意的地方junit注解

    @Before 初始化方法,每次测试方法调用前都执行一次。 @After 释放资源:每次测试方法调用后都执行一次 @Test 测试方法:在这里可以测试期望异常和超时时间 @ignore 忽略的测试方法 @BeforeClass 针对所有测试,只...

    java类中静态域、块,非静态域、块,构造函数的初始化顺序

    1. **静态域初始化**:所有静态域按它们在源代码中出现的顺序进行初始化。 2. **静态块执行**:所有静态块按它们在源代码中出现的顺序依次执行。 3. **非静态域初始化**:所有非静态域按它们在源代码中出现的顺序...

    Junit使用说明 详细

    2. `@Before`: 在每个测试方法执行之前,都会先执行一次标注了`@Before`的方法,常用于初始化测试环境。 3. `@After`: 在每个测试方法执行之后,都会执行一次标注了`@After`的方法,常用于清理测试环境。 4. `@...

Global site tag (gtag.js) - Google Analytics