`

JUnit测试总结(一)利用反射编写JUnit测试

阅读更多

公司开发遵循SCRUM,SCRUM倡导测试驱动开发,即Test-driven-development (TDD)。不可否认TDD是一个很好的东西,但是严格遵循TDD需要程序员付出更多的时间构造测试用例和维护测试用例,这势必是一种成本的增加,许多公司没有坚决执行TDD往往是由于项目的成本估算以及程序员的个人习惯。个人认为,长远来看使用TDD的开发方式可以起到磨刀不误砍柴工的作用,达到事半功倍的效果。

 

做Java开发最常用的自动化测试框架就是Junit,关于JUnit的资料有很多,这里就不一一列举了。简单的测试用例谁都会写,但是如果要构造拥有低权限访问控制修饰符修饰的属性并且没有提供getter和setter方法的对象参与的测试用例有一点点麻烦,这里的低权限访问控制修饰符指得是private,default和protected.

在使用Spring的场景下,经常会通过Spring来构造出许多这样的对象(当然,不仅限于用Spring构造这样的对象,但很常见的场景便是用Spring生成)。

 

在JUnit编写Test case时可以采用两种方法进行反射获取对象的低访问控制修饰符修饰的属性。以下分别是两种方式的示例代码,被测试对象如下:

@Component("XXXService")
public class XXXService{
	
	@Autowired
	private Provider provider;	
}
 这只是一个普通的不能再普通的Spring bean,里面只有一个private属性 provider。注意:由于是要测试Spring的bean,所以在测试类里要先获得一个Spring的ApplicationContext对象,这个对象的获取要依据测试本身上下文来选择采用哪种ApplicationContext的实现类,在这里就不一一举例,只是假设测试类已经获得了一个ApplicationContext对象。

 

 

一.通过标准的Java reflection api在测试类中获得provider属性。

	@Test
	public void retrievePrivateAttributeByStandard(){
		//Retrieve the spring bean instance.
		XXXService service = (XXXService)applicationContext.getBean("XXXService");
		//Retrieve the private attribute by name.
		Field  providerField= service.getClass().getDeclaredField("provider");
		//It's required to set the accessble flag to true if the attribute is under private,protected or default.
		providerField.setAccessible(true);
		//Retrieve the attribute by the instance of the Spring bean.
		Provider provider = (Provider)providerField.get(service);
		//You can use the private property to continue build your test case.
	}
 注意:1.providerField.setAccessible(true);必须要设置,否则还是不能访问该属性。

 

       2.Provider provider = (Provider)providerField.get(service);这一步的时候要求传入的不是一个动态代理,Spring在解析接口的时候采用动态代理机制,如果是这样会报错,所以如果传入的是一个实现类的实例是没有问题的,但是如果Provider是个接口,就会报错,关于处理动态代理的问题,这里先不讨论,后续我会更新。

 

二.通过Spring的反射工具类来获得provider属性。

 

	@Test
	public void retrievePrivateAttributeByUtil(){
	    //Retrieve the spring bean instance.
	    XXXService service = (XXXService)applicationContext.getBean("XXXService");
	   //Retrieve the private attribute according to ReflectionTestUtils.
	   Provider provider = (Provider)ReflectionTestUtils.getField(service,"provider");
	   //You can use the private property to continue build your test case.
	}
 这个反射工具类是ReflectionTestUtils,参阅它的API,对于ReflectionTestUtils.getField(Object target,String name)方法的一句很重要的描述:
This method traverses the class hierarchy in search of the desired field. In addition, an attempt will be made to make non-public fields accessible, thus allowing one to get protectedprivate, and package-private fields.
所以这个工具类已经实现了访问非public属性的方法,相较于第一种方式,这种方式显然更简洁一些,不过同样需要注意,和第一种方法一样,都存在动态代理解析问题。

 虽然没有看源码,但是我推测第二种的方式是建立在第一种的方式之上,所谓知其然更应知其所以然,了解一下反射的基础API总是没错的。

 

 

分享到:
评论

相关推荐

    junit源码解析之runner

    JUnit是Java领域最广泛使用的单元测试框架之一,它极大地简化了测试代码的编写。Runner是JUnit中的一个重要概念,它是执行测试的核心组件。本篇文章将深入到JUnit的源码中,探讨Runner的实现原理,帮助开发者更好地...

    java中反射知识总结

    6. **示例应用** - 反射在许多实际场景中有广泛的应用,如Spring框架中的依赖注入,Hibernate等ORM框架中的对象关系映射,以及单元测试工具如JUnit的注解驱动测试等。 通过学习和理解Java反射,开发者可以编写出...

    JAVA反射详细讲解

    4. 测试工具:JUnit等测试框架利用反射来调用私有方法进行测试。 5. 编写通用代码:反射可以处理未知类型的对象,编写更通用的函数或方法。 三、反射的优缺点 优点: - 提高代码的灵活性,适应需求变化。 - 实现...

    注解、反射、单元测试、lombok知识点总结笔记

    使用JUnit,开发者可以编写简洁的测试代码,快速定位和修复问题。 Lombok是一个Java库,它通过注解处理器自动为类生成常见的 getter、setter、构造函数和其他常用方法,以减少样板代码。例如,使用`@Data`注解,...

    BlackBox-WhiteBox:使用JUnit框架进行黑白框单元测试

    总结来说,JUnit为Java开发者提供了便利的工具,无论进行黑盒测试还是白盒测试,都能确保代码的健壮性和正确性。理解并熟练应用这些测试策略是每个专业Java开发者必备的技能。通过编写全面的测试用例,我们可以提高...

    反射的使用

    4. 测试工具:JUnit等测试框架利用反射调用私有方法或构造器。 5. 编写通用工具类:例如,通用的数据序列化和反序列化。 四、反射的优缺点 优点: 1. 增强了代码的灵活性和可扩展性。 2. 实现动态代理,提高代码...

    java反射机制的学习心得(csdn)————程序.pdf

    6. **测试工具**:JUnit等测试框架利用反射访问私有方法,进行单元测试。 7. **插件系统**:在插件系统中,通过反射加载和调用插件类,实现动态加载功能。 8. **日志框架**:如Log4j,通过反射获取日志记录方法,...

    对私有方法进行单元测试

    这意味着将私有方法的逻辑封装到一个可测试的公有方法中,然后在测试中针对这个公有方法编写单元测试。例如,`TestCaseHelper`可能有一个`execute()`方法,它调用了`processData()`,那么我们可以在`...

    黑马程序员----泛型与反射的小运用

    在测试中,JUnit利用反射来调用私有方法进行测试;在配置文件驱动的应用中,可以通过反射根据配置动态创建和初始化对象。 泛型和反射的结合可以实现更高级的功能。例如,我们可以通过反射创建一个未知类型的集合,...

    关于反射最全的例子,这些你都懂了,反射就精了……

    - 测试工具:JUnit和其他测试框架利用反射来调用私有方法或构造器进行测试。 4. 注意事项: - 性能:反射操作通常比直接编译后的代码慢,因为它涉及到运行时的查找和安全检查。 - 安全风险:反射可以访问私有...

    粗浅看java反射机制编程开发技术共27页.pdf.zip

    - **测试工具**:单元测试框架JUnit利用反射进行方法调用,实现测试代码的编写。 - **数据库操作**:ORM框架如MyBatis通过反射将数据库查询结果映射为Java对象。 尽管反射提供了很多灵活性,但也存在性能损耗和...

    优化对Private方法进行单元测试Demo

    在Android开发中,单元测试通常使用JUnit框架,配合Mockito等库来模拟依赖,以便于隔离测试目标。对于Android应用,我们还可能使用Espresso等工具进行UI测试,但这通常针对的是用户交互层面的功能。 那么,如何正确...

    java 反射Reflection;Class类

    - 测试工具:JUnit等测试框架利用反射来调用私有方法进行测试。 - JSON库:例如Gson和Jackson通过反射将JSON字符串转换为Java对象。 总结,Java反射机制是一种强大的工具,允许在运行时对类进行深入操作,但它也...

    Java基础_第二阶段-day16每日作业卷1

    JUnit的作用在于帮助开发者编写和运行可重复的、自动化测试用例,确保代码的正确性。操作步骤通常包括创建测试类,使用@Test注解标识测试方法。 训练案例2进一步介绍了JUnit的使用,包括引入第三方jar包的步骤。这...

    JAVA中的反射机制(内含大量实例)

    例如,Spring框架通过反射来实现依赖注入,JUnit利用反射来执行测试方法。 10. **注意事项**:反射可以提供很大的灵活性,但也可能导致安全问题,因为它允许代码访问和修改原本受限的成员。此外,过度使用反射可能...

    test driven development in python

    总结来说,TDD不仅是一种软件开发的技术手段,更是一种设计理念,它鼓励开发者以测试为中心来指导代码的编写,从而提升代码质量,提高开发效率,增强软件的可靠性和可维护性。在Python环境中,TDD的实施更为简便,...

    JOOD_Test使用指南1

    在这里,我们可以使用JUnit库来编写测试用例。通过JUnit,可以对每个单独的方法进行测试,确保它们按预期工作。即使代码未完全完成,也能进行单元测试,以尽早发现并修复问题。 5. **单元测试的好处**: 单元测试有...

    JMock

    JMock 是一个流行的开源测试框架,专为Java开发者设计,用于模拟对象的行为,特别是在单元测试中。它允许程序员在不依赖真实对象的情况下测试代码,提高了测试的效率和隔离性。这篇详尽的讨论将深入JMock的核心概念...

Global site tag (gtag.js) - Google Analytics