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

2024-09-10 15:21:44 浏览数 (4)

在《通过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中可以建立被测类的集成类,对集成类进行测试。

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

0 人点赞