在《通过Gtest访问C++静态、私有、保护变量和方法》一文中介绍了如何通过Gtest访问C++静态、私有、保护变量和方法,本文介绍如何通过Junit5访问Java静态、私有、保护变量和方法。
1,访问Java保护变量和方法
保护变量和方法通过继承类的方式来实现
建立被测类:MyClass
//被测类
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。
class MyClassTestSubclass extends MyClass {
public String callProtectedMethod() {
return protectedMethod();
}
public int getProtectedVar() {
return protectedVar;
}
}
callProtectedMethod()方法返回MyClass类的保护方法ProtectedMethod();
getProtectedVar()方法返回MyClass类的保护变量protectedVar。
建立测试类Myprotected
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
//被测类
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。
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
//被测类
class MyClass {
public static int staticVar = 10;
public static int staticMethod(int input) {
return input * 2;
}
}
staticVar为静态对象;
staticMethod为静态方法。
建立被测类:MyClassTest
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中可以建立被测类的集成类,对集成类进行测试。
最后一句话,不建议测试私有变量和方法,如果万不得已,可以先考虑代码的重构。