前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过JUnit5访问Java静态、私有、保护变量和方法

通过JUnit5访问Java静态、私有、保护变量和方法

作者头像
顾翔
发布2024-09-10 15:21:44
1330
发布2024-09-10 15:21:44
举报
文章被收录于专栏:啄木鸟软件测试

在《通过Gtest访问C++静态、私有、保护变量和方法》一文中介绍了如何通过Gtest访问C++静态、私有、保护变量和方法,本文介绍如何通过Junit5访问Java静态、私有、保护变量和方法。

1,访问Java保护变量和方法

保护变量和方法通过继承类的方式来实现

建立被测类:MyClass

代码语言:javascript
复制
//被测类
class MyClass {
       protected int protectedVar;
           
       public void setProtectedVar(int value) {
           protectedVar = value;
       }
       
       protected String protectedMethod() {
              return "hello world";
       }
}

protectedVar为保护对象,通过public void setProtectedVar(int value)方法来设置。

protectedMethod():保护方法。

为了测试保护对象和保护方法,需要构建MyClassTestSubclass类来继承被测类MyClass。

代码语言:javascript
复制
class MyClassTestSubclass extends MyClass {
       public String callProtectedMethod() {
              return protectedMethod(); 
       }
       
       public int getProtectedVar() {
        return protectedVar;
    }
}

callProtectedMethod()方法返回MyClass类的保护方法ProtectedMethod();

getProtectedVar()方法返回MyClass类的保护变量protectedVar。

建立测试类Myprotected

代码语言:javascript
复制
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
           
public class MyClassTest {
    @Test
    public void testProtectedMethod() {
        MyClassTestSubclass testObj = new MyClassTestSubclass();
        Assertions.assertEquals( "hello world", testObj.callProtectedMethod());    
    }
    
    @Test
    public void testProtectedVar() {
        MyClassTestSubclass testObj = new MyClassTestSubclass();
        testObj.setProtectedVar(42);
        Assertions.assertEquals(42, testObj.getProtectedVar());
    }
}

testProtectedMethod()方法通过继承类MyClassTestSubclass测试MyClass类的保护方法ProtectedMethod();

getProtectedVar()方法通过继承类MyClassTestSubclass测试返回MyClass类的保护变量protectedVar。

2,访问Java私有变量和方法

私有变量和方法通过反射机制来实现。

建立被测类MyClass.java

代码语言:javascript
复制
//被测类
class MyClass {
       private int privateVar;
           
    public void setPrivateVar(int value) {
        privateVar = value;
    }    
       
       private String privateMethod() {
              return "hello world";
       }
}

privateVar为私有对象,通过public void setPrivateVar(int value)方法来设置;

privateMethod()为私有方法。

通过反射机制建立测试类MyClassTest。

代码语言:javascript
复制
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
           
public class MyClassTest {
    @Test
    public void testPrivateMethod() throws Exception {
        MyClass obj = new MyClass();
        Method method = MyClass.class.getDeclaredMethod("privateMethod");
        method.setAccessible(true); // 设置访问权限
        Assertions.assertEquals( "hello world", method.invoke(obj));
    }    
    
    @Test
    public void testPrivateVar() throws Exception {
        MyClass obj = new MyClass();
        obj.setPrivateVar(42);
        Field field = MyClass.class.getDeclaredField("privateVar");
        field.setAccessible(true); // 设置访问权限
        int value = field.getInt(obj); // 访问私有变量
        Assertions.assertEquals(42, value); // 验证私有变量的值
    }
}

testPrivateMethod()方法测试MyClass类的私有方法privateMethod();

testPrivateVar()方法测试MyClass类的私有变量privateVar。

3,访问Java静态变量和方法

静态变量和方法通过类.变量或类.方法()直接测试。

建立被测类MyClass.java

代码语言:javascript
复制
//被测类
class MyClass {
       public static int staticVar = 10;
       
       public static int staticMethod(int input) {
              return input * 2;    
       }
}

staticVar为静态对象;

staticMethod为静态方法。

建立被测类:MyClassTest

代码语言:javascript
复制
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class MyClassTest {
    @Test
    public void testStaticVar() {
           Assertions.assertEquals(10, MyClass.staticVar);
    }
    
    @Test
    public void testStaticMethod() {
        int result = MyClass.staticMethod(5);
        Assertions.assertEquals(10, result);
    }
}

testStaticMethod()方法测试MyClass类的静态方法staticMethod();

testStaticVar()方法测试MyClass类的静态变量staticVar。

《通过Gtest访问C++静态、私有、保护变量和方法》和这篇《通过JUnit5访问Java静态、私有、保护变量和方法》两篇文章可以看出:

对于私有变量和方法:在C++中通过友类可以访问;在Java中通过反射机制可以访问。

对于保护变量和方法:在C++中和Java中通过继承类可以访问。

所以在C++中测试类访问私有变量和方法可将测试类设为被测试类的友类;在Java中测试类访问私有变量和方法通过反射机制来实现。

在C++中测试类访问保护变量和方法可将测试类设为被测试类的继承类;在Java中可以建立被测类的集成类,对集成类进行测试。

最后一句话,不建议测试私有变量和方法,如果万不得已,可以先考虑代码的重构。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档