在《通过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中可以建立被测类的集成类,对集成类进行测试。
最后一句话,不建议测试私有变量和方法,如果万不得已,可以先考虑代码的重构。