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

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

目录
相关文章
|
5天前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
23 6
|
5天前
|
NoSQL JavaScript Java
Java Python访问MongoDB
Java Python访问MongoDB
14 4
|
11天前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
36 11
|
7天前
|
Java
Java的方法详解
Java的方法是类中的重要组成部分,用于定义类的行为。方法可以接收参数、执行操作并返回结果。其基本语法包括返回类型、方法名、参数列表和方法体。方法支持重载,即同名但参数不同的多个方法;静态方法则直接通过类名调用,无需实例化。此外,Java还支持可变参数,允许方法接收不定数量的参数。通过访问修饰符如`public`、`protected`、`private`,可以控制方法的可见性。方法是实现类功能的基本单元,增强了程序的灵活性和复用性。
|
14天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
19天前
|
Java
用JAVA架建List集合为树形结构的代码方法
这段代码定义了一个表示树形结构的 `Node` 类和一个用于构建树形结构的 `TreeController`。`Node` 类包含基本属性如 `id`、`pid`、`name` 和 `type`,以及子节点列表 `children`。`TreeController` 包含初始化节点列表并将其转换为树形结构的方法。通过过滤和分组操作实现树形结构的构建。详情可见:[代码示例链接1](http://www.zidongmutanji.com/zsjx/43551.html),[代码效果参考链接2](https://www.257342.com/sitemap/post.html)。
28 5
|
17天前
|
Java 开发者
探索Java中的Lambda表达式:简化代码的现代方法
【8月更文挑战第31天】Lambda表达式在Java 8中首次亮相,为Java开发者提供了一种更简洁、灵活的编程方式。它不仅减少了代码量,还提升了代码的可读性和可维护性。本文将通过实际示例,展示Lambda表达式如何简化集合操作和事件处理,同时探讨其对函数式编程范式的支持。
|
4天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
15天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
75 6
【Java学习】多线程&JUC万字超详解
|
8天前
|
Java 调度 开发者
Java并发编程:深入理解线程池
在Java的世界中,线程池是提升应用性能、实现高效并发处理的关键工具。本文将深入浅出地介绍线程池的核心概念、工作原理以及如何在实际应用中有效利用线程池来优化资源管理和任务调度。通过本文的学习,读者能够掌握线程池的基本使用技巧,并理解其背后的设计哲学。