当junit进行单元测试时,遇到没有返回值的方法,怎么办?
实例
package com.src.unittest; public class unittest { private static String stringtest; public void setvalue(String temp){ stringtest=temp+"123"; //get value: stringtest } public String getvalue(){ //return the stringtest value for unit test return stringtest; } }
如果需要进行测试的方法没有返回值,那么这个方法一定会对某个对象做一些操作,比如改变某个属性、变量的值等,否则这这个方法就什么都没做,这是没有任何意义的
对于没有返回值的方法,在进行测试时可以对可观测到的变动进行测试,即要测试它的行为。不同方法有不同的测试策略,具体视情况而定
具体来说,上面所举的例子中,要测试setValue()方法,这个方法的行为我们可以理解为改变了stringtest 的值,我们就可以对stringtest的值进行验证
测试用例可以这样写
import static org.junit.Assert.*; import org.junit.Test; import com.beyondsoft.UnitTest; public class TestUnitTest { UnitTest tStr = new UnitTest(); @Test public void testSetvalue() { tStr.setvalue("123"); assertEquals("123123", tStr.stringtest); } }
但是,由于 privatestatic String stringtest; 中stringtest作用域的问题致使不能在测试case中直接调用stringtest
两种解决办法:
1、先将作用域private更改为可测试的范围,如public,验证该方法功能没有问题之后,一定要记得将作用域改回来,但是,这样的话就修改了源代码,这不是最合理的方式
2、使用java反射机制获取stringtest值,进行测试(同样的,私有方法的测试也可以使用反射机制进行测试)
具体实现:
import static org.junit.Assert.*; import java.lang.reflect.Field; import org.junit.Test; import com.beyondsoft.UnitTest; public class TestUnitTest { UnitTest tStr = new UnitTest(); @Test public void testSetvalue(){ Class t = UnitTest.class; Field field; try { field = t.getDeclaredField("stringtest"); field.setAccessible(true); //设置为true,无视java的封装 tStr.setvalue("123"); assertEquals("123123", field.get(t.newInstance())); } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException | InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
私有方法测试,反射机制的使用:
Method method = targetClass.getDeclaredMethod("方法名", 方法参数类); method.setAccessible(true);return method.invoke(类的实例, 方法参数值); Field field = targetClass.getDeclaredField("私有变量名");field.setAccessible(true); field.set(类的实例, 私有变量值);
相关推荐
5. **断言结果**:在JUnit测试中,我们可以使用`assertEquals()`等断言方法,验证私有方法执行后的结果是否符合预期。 下面是一个简单的例子,展示如何使用JUnit测试私有方法: ```java import org.junit.Test; ...
6. **断言结果**:在测试方法的最后,使用JUnit的断言方法(如`assertEquals()`、`assertThat()`)来验证测试结果是否符合预期。 7. **测试覆盖率**:除了基础功能测试,还应覆盖各种边界条件、异常处理和错误路径...
在本文中,我们将深入探讨"PowerMock+Mockito-junit测试套件1.6.3版本"中的关键概念、功能和使用方法。 **PowerMock** PowerMock是一个扩展了其他Mocking框架(如EasyMock和Mockito)的库,它允许开发者对静态方法...
我们使用`when(...).thenReturn(...)`来设置模拟的返回值,然后在测试用例中调用这些方法,确保它们按预期工作。 需要注意的是,虽然PowerMock提供了强大的功能,但过度依赖模拟可能导致测试不够清晰或者掩盖了代码...
JUnit虽然强大,但可能需要配合其他库,如PowerMock来模拟静态方法或私有方法,或使用DBUnit处理数据库测试。 ### 6. 结语 JUnit作为面向对象软件测试的重要工具,极大地推动了软件质量的提升。掌握JUnit的使用...
在搭建单元测试环境时,需要使用的 Jar 包有 junit4.jar 和 struts2-junit-plugin-2.1.8.jar。junit4.jar 是 Eclipse 自带的,可以在项目路径中导入。struts2-junit-plugin-2.1.8.jar 是 Struts2 提供的测试插件,...
PowerMock是基于EasyMock的一个扩展,它允许模拟静态方法、构造函数、final类和方法、私有方法以及删除静态初始化器。在"powermock-easymock-junit-1.6.1.zip"这个压缩包中,包含了这些工具的特定版本。 首先,我们...
通常,JUnit无法直接测试私有方法,但JMockit通过字节码操作技术,可以让我们在测试中透明地访问和控制这些方法。 5. **静态方法和构造器的模拟**:除了实例方法,JMockit还可以模拟静态方法和构造器的行为,这对于...
在使用PowerMock时,我们需要配合其他的测试框架,如JUnit或TestNG,以及模拟库如Mockito,来编写测试代码。PowerMock提供了一系列API和注解,如`@RunWith(PowerMockRunner.class)`和`@PrepareForTest`,帮助我们在...
PowerMock主要在以下场景中使用:测试静态方法、私有方法、final类方法、构造函数、静态初始化器,以及模拟对静态类的new操作等。 #### HelloWorld示例 PowerMock的HelloWorld示例通常会展示如何使用PowerMock创建...
在Java编程中,`@Unit` 注解通常指的是 `@JUnit` 或者是与单元测试相关的概念,因为 `JUnit` 是一个广泛使用的Java单元测试框架,它的注解用于标记测试方法。然而,`@Unit` 不是标准的JUnit注解,可能是自定义的或者...
- 模拟对象有一些限制,比如不能模拟final类和方法,以及私有构造函数等,这需要开发者根据实际情况选择合适的模拟策略。 7. **Strict和Nice模式** - Strict模式下,Easymock会严格检查所有未预设的行为,任何未...
此外,为了方便使用,通常会将Mockito的静态方法导入到测试类中: ```java import static org.mockito.Mockito.*; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; ``` #### ...
4. 在测试方法中使用Mock对象。 5. 使用`verify()`确保所有录制的方法都被调用。 **其他用法** - 指定期望的调用次数。 - 指定返回值。 - 处理异常。 - 创建自定义的返回值和异常。 **PowerMock的引入** ...
- 在测试中,我们可以使用`Deencapsulation`工具类来访问和修改私有字段、方法,以及执行其他类型的黑盒操作。 3. **验证(Verification)** - JMockit提供了验证机制来确保在测试过程中,模拟对象的方法被正确...
2. **广泛的模拟支持**:它可以模拟静态方法、final类和方法、私有方法以及构造器。 3. **运行时动态模拟**:Jmockit可以在运行时改变类的行为,这使得它在处理复杂场景时特别有用。 4. **自动验证**:模拟的对象会...
- 测试驱动开发:TDD理念,JUnit测试框架的使用。 - 代码风格与重构:良好的编程习惯,提高代码可读性和可维护性。 《Java编程思想》第三版中文版不仅涵盖了Java语言的基础,还深入探讨了其高级特性和实际应用,...
- 尽可能使类不可变,提供私有构造函数并使用静态工厂方法创建实例。 - 实现接口优于继承类,以减少类层次结构的复杂性。 - 避免在类中使用公共静态变量,考虑使用常量类。 5. **异常处理** - 使用具体的异常...
本规范覆盖了Java开发过程中多个方面的要求,包括但不限于代码组织与风格、注释规范、命名规则、声明规则、类与接口的设计、方法实现、表达式与语句的使用、错误与异常处理机制、测试与BUG跟踪流程以及性能优化与...