`
samjavaeye
  • 浏览: 193725 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

对私有方法进行单元测试

    博客分类:
  • Java
 
阅读更多

为了提升代码质量,减少缺陷,方便以后修改代码,除了对类中public方法编写单元测试案例以外,最好对私有方法也编写测试案例。方法也简单,利用java的反射,获得私有方法的Method对象,然后直接调用即可。

获得私有方法的Method对象的方法如下:

/**
	 * 测试私有方法时使用,将类的私有方法转换成可访问的方法。
	 * @param clazz 类的类型,不能为空
	 * @param methodName 方法名称,不能为空
	 * @param argClasses 方法的参数类数组,不能为空,也不能没有元素
	 * @return 可访问的方法对象
	 */
	public static Method getPrivateMethodForTest(Class<?> clazz,
			String methodName, Class<?>[] argClasses)
			throws NoSuchMethodException, SecurityException {
		if (clazz == null || methodName == null || argClasses== null) {
			throw new IllegalArgumentException("clazz、methodName和argClasses都不能为空。");
		}
		// 获取私有方法和他的参数
		Method method = clazz.getDeclaredMethod(methodName, argClasses);
		method.setAccessible(true); // 允许访问
		return method;
	}

 如果要获取类的私有属性值,可以使用此方法:

/**
	 * 获取私有类属性的值
	 * 
	 * @param clazz
	 *            类的类型,不能为空
	 * @param obj
	 *            类的实例,不能为空
	 * @param fieldName
	 *            类属性名称,不能为空
	 * @return 类属性的值
	 * @throws NoSuchFieldException
	 *             类属性名称不存在时抛出
	 * @throws SecurityException
	 * @throws IllegalArgumentException
	 *             三个参数中任一参数为空时抛出
	 * @throws IllegalAccessException
	 */
	public static Object getPrivateFieldValue(Class<?> clazz, Object obj,
			String fieldName) throws NoSuchFieldException, SecurityException,
			IllegalArgumentException, IllegalAccessException {
		if (clazz == null || obj == null || fieldName == null) {
			throw new IllegalArgumentException("clazz、obj和fieldName都不能为空");
		}
		Field field = clazz.getDeclaredField(fieldName);
		field.setAccessible(true);
		return field.get(obj);
	}

 如果要设置类私有属性的值,可以使用此方法:

/**
	 * 设置私有类属性的值
	 * 
	 * @param clazz
	 *            类的类型,不能为空
	 * @param obj
	 *            类的实例,不能为空
	 * @param fieldName
	 *            类属性名称,不能为空
	 * @param value
	 *            类属性的值
	 * @throws NoSuchFieldException
	 *             类属性名称不存在时抛出
	 * @throws SecurityException
	 * @throws IllegalArgumentException
	 *             三个参数中任一参数为空时抛出
	 * @throws IllegalAccessException
	 */
	public static void setPrivateFieldValue(Class<?> clazz, Object obj,
			String fieldName, Object value) throws NoSuchFieldException,
			SecurityException, IllegalArgumentException, IllegalAccessException {
		if (clazz == null || obj == null || fieldName == null) {
			throw new IllegalArgumentException("clazz、obj和fieldName都不能为空");
		}
		Field field = clazz.getDeclaredField(fieldName);
		field.setAccessible(true);
		field.set(obj, value);
	}

 得到私有方法的Method对象以后,可以这么调用:

public void testGetPrivateMethodForTest() throws NoSuchMethodException,
			SecurityException, IllegalAccessException,
			IllegalArgumentException, InvocationTargetException {
		Method method = TestCaseHelper.getPrivateMethodForTest(obj.getClass(),
				"sayHello", new Class[] { String.class });
		String returnValue = (String) method
				.invoke(obj, new Object[] { "Sam" });
		Assert.assertEquals("Hello, Sam", returnValue);
	}

 

分享到:
评论

相关推荐

    软件测试中单元测试VS私有方法

    软件测试中单元测试VS私有方法软件测试前几天,NareshJain在ManagedChaos上发了篇博客,总结了一些测试中的badsmell。例如:●一个方法中有太多testcase——被测试的方法做了太多事情。●太多的setup/teardown——...

    如何在C ++中对私有函数进行单元测试?

    本篇文章将详细探讨如何在C++的不同标准版本(C++98、C++11、C++14)中对私有函数进行单元测试。 首先,理解C++的访问控制是关键。在C++中,`private`成员只能在类的内部被访问,而`public`成员可以从任何地方访问...

    利用PowerMock模拟静态方法和私有方法的示例

    本文将详细介绍如何利用PowerMock来模拟静态方法和私有方法,以便进行有效的单元测试。 PowerMock是一个强大的Java单元测试框架,它可以扩展其他流行的测试框架,如JUnit和TestNG。它的核心功能之一就是能够模拟...

    c#单元测试例子

    单元测试是对软件中的最小可测试单元进行检查和验证,如函数、方法或类。它的目标是确保代码的每一个部分都能正确地执行其功能,这样在后续的集成测试和系统测试中,可以更专注于不同模块间的交互。 在C#中,我们...

    NUnit单元测试方法

    NUnit 执行单元测试方法,包含public, private, protected 方法的测试方法。 NUnit单元测试 私有(private)方法单元测试 protected方法单元测试 public 方法单元测试

    VS2010单元测试工具使用

    对于私有方法的测试,VS2010通过私有访问器(PrivateObject)提供支持,使得即使非公共成员也可以进行单元测试。 总结来说,VS2010的单元测试工具提供了完善的环境,帮助开发者构建和执行测试,确保代码的质量和...

    VS2005中的单元测试

    VS2005中的单元测试是软件开发过程中用于验证代码功能正确性的一种自动化测试方法。在Visual Studio 2005中,开发人员可以利用内置的测试工具来创建、执行和管理单元测试,确保代码质量并减少潜在的缺陷。本文将详细...

    单元测试工具 C++单元测试工具 静态代码分析 代码动态测试

    C++单元测试工具 Parasoft C++ Test 简介 Parasoft C++ Test 是 Parasoft 公司... Parasoft C++ Test 是一个功能强大且实用的单元测试工具,对 C/C++源代码进行自动化单元测试,可以帮助我们提高代码的质量和可靠性。

    Visual Studio单元测试教程

    本教程将详细介绍如何在VS中利用其自身的工具进行单元测试,包括测试项目的创建、不同类型的测试以及如何运行和分析测试结果。 一、VS2005的测试功能 1. 测试简介 VS2005引入了测试项目,允许开发者在同一个解决...

    单元测试工具C++Test简介

    白盒测试C++Test对C/C++源代码进行分析,针对所有的类的成员函数( 单元测试工具C++Test简介 软件测试 C++Test是Parasoft公司出品的一个针对C/C++源代码进行自动化单元测试的工具。它可以对源代码进行三种测试:...

    Struts2+Spring+hibernate中对action的单元测试环境搭建[总结].pdf

    首先,需要了解为什么需要对 Action 进行单元测试。在项目中,如果没有 Service 层,而是在 Action 中直接操作 Dao 层的函数,这将导致代码结构不清晰、难以维护。因此,需要对 Action 进行单元测试,以确保代码的...

    JUnit4利用反射机制测试类的私有成员

    然而,对于类的私有成员(包括私有方法和私有属性),由于其封装性,通常不易直接进行测试。但实际情况中,私有成员可能对类的行为产生关键影响,因此测试它们也是必要的。本文将介绍如何使用JUnit4结合Java的反射...

    junit测试private函数

    JUnit作为Java领域最流行的单元测试框架,通常用于测试公共方法。然而,有时我们可能需要测试私有(private)方法,因为它们可能包含关键逻辑,尽管直接调用它们并不符合面向对象设计的原则。本篇文章将详细介绍如何...

    VS2010中的单元测试

    私有方法的测试通常是单元测试中的一个挑战,因为它们不能被外部直接调用。VS2010通过私有访问器(Private Accessor)解决了这个问题。私有访问器是一种动态生成的代理类,它可以访问原本私有的成员。通过这个功能,...

    spring MVC junit 单元测试(controller)

    这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在的问题,提高软件的可靠性和可维护性。 首先,让我们了解Spring MVC的基本概念。Spring MVC...

    java反射机制,调用私有方法

    2. **访问私有成员**:通过反射,我们可以访问类的私有字段和方法,这在单元测试、调试或某些特定场景下可能需要。`Method`类提供了`getDeclaredMethod()`方法来获取类的私有方法,而`invoke()`方法则可以用来调用这...

    单元测试教程

    - **问题:** 使用main()方法进行测试时,可以访问类的私有成员和方法,这可能导致测试结果不可靠。 - **解决方案:** 使用专门的测试框架(如JUnit)来编写测试,以确保测试的可靠性和准确性。 **3.3 缺乏自动测试...

    VS2010单元测试工具使用.rar_4S3Z_VS2010单元测试工具使用_wingl2t

    单元测试是一种编程最佳实践,它允许开发者对代码的各个独立部分进行验证,确保它们按照预期工作。以下是对VS2010单元测试工具的详细讲解。 ### 一、创建和管理单元测试 1. **创建测试项目**:在VS2010中,你可以...

Global site tag (gtag.js) - Google Analytics