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

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

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

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

目录
相关文章
|
18天前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
26天前
|
Java 编译器
Java重复定义变量详解
这段对话讨论了Java中变量作用域和重复定义的问题。学生提问为何不能重复定义变量导致编译错误,老师通过多个示例解释了编译器如何区分不同作用域内的变量,包括局部变量、成员变量和静态变量,并说明了使用`this`关键字和类名来区分变量的方法。最终,学生理解了编译器在逻辑层面检查变量定义的问题。
Java重复定义变量详解
|
4天前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
14 1
|
22天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
76 4
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
48 17
|
26天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
72 2
|
28天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
44 3
|
1月前
|
SQL Java 数据库连接
打破瓶颈:利用Java连接池技术提升数据库访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,避免了频繁的连接建立和断开,显著提升了数据库访问效率。常见的连接池库包括HikariCP、C3P0和DBCP,它们提供了丰富的配置选项和强大的功能,帮助优化应用性能。
49 2
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
20 3
|
2月前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。