`

使用Junit测试没有返回值的方法以及测试私有属性

阅读更多

当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(类的实例, 私有变量值); 

 

分享到:
评论

相关推荐

    junit测试private函数

    5. **断言结果**:在JUnit测试中,我们可以使用`assertEquals()`等断言方法,验证私有方法执行后的结果是否符合预期。 下面是一个简单的例子,展示如何使用JUnit测试私有方法: ```java import org.junit.Test; ...

    spring MVC junit 单元测试(controller)

    6. **断言结果**:在测试方法的最后,使用JUnit的断言方法(如`assertEquals()`、`assertThat()`)来验证测试结果是否符合预期。 7. **测试覆盖率**:除了基础功能测试,还应覆盖各种边界条件、异常处理和错误路径...

    PowerMock+Mockito-junit测试套件1.6.3版本

    在本文中,我们将深入探讨"PowerMock+Mockito-junit测试套件1.6.3版本"中的关键概念、功能和使用方法。 **PowerMock** PowerMock是一个扩展了其他Mocking框架(如EasyMock和Mockito)的库,它允许开发者对静态方法...

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

    我们使用`when(...).thenReturn(...)`来设置模拟的返回值,然后在测试用例中调用这些方法,确保它们按预期工作。 需要注意的是,虽然PowerMock提供了强大的功能,但过度依赖模拟可能导致测试不够清晰或者掩盖了代码...

    面象对象软件测试技术junit

    JUnit虽然强大,但可能需要配合其他库,如PowerMock来模拟静态方法或私有方法,或使用DBUnit处理数据库测试。 ### 6. 结语 JUnit作为面向对象软件测试的重要工具,极大地推动了软件质量的提升。掌握JUnit的使用...

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

    在搭建单元测试环境时,需要使用的 Jar 包有 junit4.jar 和 struts2-junit-plugin-2.1.8.jar。junit4.jar 是 Eclipse 自带的,可以在项目路径中导入。struts2-junit-plugin-2.1.8.jar 是 Struts2 提供的测试插件,...

    powermock-easymock-junit-1.6.1.zip

    PowerMock是基于EasyMock的一个扩展,它允许模拟静态方法、构造函数、final类和方法、私有方法以及删除静态初始化器。在"powermock-easymock-junit-1.6.1.zip"这个压缩包中,包含了这些工具的特定版本。 首先,我们...

    jmockit-1.6.zip

    通常,JUnit无法直接测试私有方法,但JMockit通过字节码操作技术,可以让我们在测试中透明地访问和控制这些方法。 5. **静态方法和构造器的模拟**:除了实例方法,JMockit还可以模拟静态方法和构造器的行为,这对于...

    PowerMock是一个Java框架能够允许你单元测试通常被视为不可测试的代码

    在使用PowerMock时,我们需要配合其他的测试框架,如JUnit或TestNG,以及模拟库如Mockito,来编写测试代码。PowerMock提供了一系列API和注解,如`@RunWith(PowerMockRunner.class)`和`@PrepareForTest`,帮助我们在...

    PowerMock实战手册.pdf

    PowerMock主要在以下场景中使用:测试静态方法、私有方法、final类方法、构造函数、静态初始化器,以及模拟对静态类的new操作等。 #### HelloWorld示例 PowerMock的HelloWorld示例通常会展示如何使用PowerMock创建...

    @Unit注解处理实现代码

    在Java编程中,`@Unit` 注解通常指的是 `@JUnit` 或者是与单元测试相关的概念,因为 `JUnit` 是一个广泛使用的Java单元测试框架,它的注解用于标记测试方法。然而,`@Unit` 不是标准的JUnit注解,可能是自定义的或者...

    easymock教程[归纳].pdf

    - 模拟对象有一些限制,比如不能模拟final类和方法,以及私有构造函数等,这需要开发者根据实际情况选择合适的模拟策略。 7. **Strict和Nice模式** - Strict模式下,Easymock会严格检查所有未预设的行为,任何未...

    mockito单元测试

    此外,为了方便使用,通常会将Mockito的静态方法导入到测试类中: ```java import static org.mockito.Mockito.*; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; ``` #### ...

    EasyMock and PowerMock入门PPT

    4. 在测试方法中使用Mock对象。 5. 使用`verify()`确保所有录制的方法都被调用。 **其他用法** - 指定期望的调用次数。 - 指定返回值。 - 处理异常。 - 创建自定义的返回值和异常。 **PowerMock的引入** ...

    jmockit官网文档整理

    - 在测试中,我们可以使用`Deencapsulation`工具类来访问和修改私有字段、方法,以及执行其他类型的黑盒操作。 3. **验证(Verification)** - JMockit提供了验证机制来确保在测试过程中,模拟对象的方法被正确...

    Jmockit in Action

    2. **广泛的模拟支持**:它可以模拟静态方法、final类和方法、私有方法以及构造器。 3. **运行时动态模拟**:Jmockit可以在运行时改变类的行为,这使得它在处理复杂场景时特别有用。 4. **自动验证**:模拟的对象会...

    Java 编程思想中文第三版(PDF)

    - 测试驱动开发:TDD理念,JUnit测试框架的使用。 - 代码风格与重构:良好的编程习惯,提高代码可读性和可维护性。 《Java编程思想》第三版中文版不仅涵盖了Java语言的基础,还深入探讨了其高级特性和实际应用,...

    Google Java编程风格指南

    - 尽可能使类不可变,提供私有构造函数并使用静态工厂方法创建实例。 - 实现接口优于继承类,以减少类层次结构的复杂性。 - 避免在类中使用公共静态变量,考虑使用常量类。 5. **异常处理** - 使用具体的异常...

    Java开发规范(编程风格)

    本规范覆盖了Java开发过程中多个方面的要求,包括但不限于代码组织与风格、注释规范、命名规则、声明规则、类与接口的设计、方法实现、表达式与语句的使用、错误与异常处理机制、测试与BUG跟踪流程以及性能优化与...

Global site tag (gtag.js) - Google Analytics