This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new 1caee8e7bb Refactor: Replace Whitebox with standard reflection in 
library, core and configuration (#13713)
1caee8e7bb is described below

commit 1caee8e7bbf6de2cfb8aca4df6ce726362175b48
Author: Hm <[email protected]>
AuthorDate: Fri Feb 27 15:13:04 2026 +0900

    Refactor: Replace Whitebox with standard reflection in library, core and 
configuration (#13713)
---
 docs/en/changes/changes.md                         |  2 ++
 .../api/FetchingConfigWatcherRegisterTest.java     | 25 ++++++++++----
 .../ConsulConfigurationWatcherRegisterTest.java    | 26 +++++++++-----
 .../nacos/NacosConfigWatcherRegisterTest.java      | 10 +++---
 .../ut/ZookeeperConfigWatcherRegisterTestCase.java |  7 ++--
 .../configuration/grpc/GRPCConfigurationTest.java  |  9 ++---
 .../analysis/worker/MetricsStreamProcessor.java    |  2 +-
 .../analysis/data/LimitedSizeBufferedDataTest.java | 11 +++++-
 .../core/analysis/meter/MeterSystemTest.java       | 40 ++++++++++++++++------
 .../core/hierarchy/HierarchyQueryServiceTest.java  | 19 ++++++----
 .../core/query/ServiceTopologyBuilderTest.java     |  8 +++--
 .../remote/client/RemoteClientManagerTestCase.java |  3 ++
 .../server/core/storage/PersistenceTimerTest.java  |  9 +++--
 .../elasticsearch/bulk/ElasticSearchIT.java        |  6 ++--
 .../oap/server/library/util/FieldsHelperTest.java  |  8 +++--
 15 files changed, 128 insertions(+), 57 deletions(-)

diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index f400946bc0..6b0c976e97 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -66,6 +66,8 @@
   | Schedulers + others                   | ~24                | ~24 | Mostly 
unchanged                            |
   | **Total (OAP threads)**               | **150+**           | **~72** | 
**~50% reduction, stable in high payload.** |
 
+* Replace PowerMock Whitebox with standard Java Reflection in 
`server-library`, `server-core`, and `server-configuration` to support JDK 25+.
+
 #### OAP Server
 
 * KubernetesCoordinator: make self instance return real pod IP address instead 
of `127.0.0.1`.
diff --git 
a/oap-server/server-configuration/configuration-api/src/test/java/org/apache/skywalking/oap/server/configuration/api/FetchingConfigWatcherRegisterTest.java
 
b/oap-server/server-configuration/configuration-api/src/test/java/org/apache/skywalking/oap/server/configuration/api/FetchingConfigWatcherRegisterTest.java
index 82339e51a1..3c78601aab 100644
--- 
a/oap-server/server-configuration/configuration-api/src/test/java/org/apache/skywalking/oap/server/configuration/api/FetchingConfigWatcherRegisterTest.java
+++ 
b/oap-server/server-configuration/configuration-api/src/test/java/org/apache/skywalking/oap/server/configuration/api/FetchingConfigWatcherRegisterTest.java
@@ -25,8 +25,8 @@ import 
org.apache.skywalking.oap.server.library.module.ServiceNotProvidedExcepti
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.powermock.reflect.Whitebox;
 
+import java.lang.reflect.Field;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
@@ -93,7 +93,7 @@ public class FetchingConfigWatcherRegisterTest {
     }
 
     @Test
-    public void testRegisterTableLog() {
+    public void testRegisterTableLog() throws Exception {
         register.registerConfigChangeWatcher(new 
ConfigChangeWatcher("MockModule", new MockProvider(), "prop2") {
             @Override
             public void notify(ConfigChangeEvent value) {
@@ -118,11 +118,22 @@ public class FetchingConfigWatcherRegisterTest {
         });
 
         register.configSync();
-        FetchingConfigWatcherRegister.Register registerTable = 
Whitebox.getInternalState(this.register, "singleConfigChangeWatcherRegister");
-        FetchingConfigWatcherRegister.Register groupRegisterTable = 
Whitebox.getInternalState(this.register, "groupConfigChangeWatcherRegister");
-
-        String expected = "Following dynamic config items are available." + 
FetchingConfigWatcherRegister.LINE_SEPARATOR + 
"---------------------------------------------" + 
FetchingConfigWatcherRegister.LINE_SEPARATOR + "key:MockModule.provider.prop2   
 module:MockModule    provider:provider    value(current):null" + 
FetchingConfigWatcherRegister.LINE_SEPARATOR;
-        String groupConfigExpected = "Following dynamic config items are 
available." + FetchingConfigWatcherRegister.LINE_SEPARATOR + 
"---------------------------------------------" + 
FetchingConfigWatcherRegister.LINE_SEPARATOR + 
"key:MockModule.provider.groupItems1    module:MockModule    provider:provider  
  groupItems(current):null" + FetchingConfigWatcherRegister.LINE_SEPARATOR;
+        Field singleField = 
FetchingConfigWatcherRegister.class.getDeclaredField("singleConfigChangeWatcherRegister");
+        singleField.setAccessible(true);
+        FetchingConfigWatcherRegister.Register registerTable = 
(FetchingConfigWatcherRegister.Register) singleField.get(this.register);
+        Field groupField = 
FetchingConfigWatcherRegister.class.getDeclaredField("groupConfigChangeWatcherRegister");
+        groupField.setAccessible(true);
+        FetchingConfigWatcherRegister.Register groupRegisterTable = 
(FetchingConfigWatcherRegister.Register) groupField.get(this.register);
+
+        String expected = "Following dynamic config items are available." + 
FetchingConfigWatcherRegister.LINE_SEPARATOR
+                + "---------------------------------------------" + 
FetchingConfigWatcherRegister.LINE_SEPARATOR
+                + "key:MockModule.provider.prop2    module:MockModule    
provider:provider    value(current):null"
+                + FetchingConfigWatcherRegister.LINE_SEPARATOR;
+        String groupConfigExpected = "Following dynamic config items are 
available."
+                + FetchingConfigWatcherRegister.LINE_SEPARATOR + 
"---------------------------------------------"
+                + FetchingConfigWatcherRegister.LINE_SEPARATOR
+                + "key:MockModule.provider.groupItems1    module:MockModule    
provider:provider    groupItems(current):null"
+                + FetchingConfigWatcherRegister.LINE_SEPARATOR;
 
         assertEquals(expected, registerTable.toString());
         assertEquals(groupConfigExpected, groupRegisterTable.toString());
diff --git 
a/oap-server/server-configuration/configuration-consul/src/test/java/org/apache/skywalking/oap/server/configuration/consul/ConsulConfigurationWatcherRegisterTest.java
 
b/oap-server/server-configuration/configuration-consul/src/test/java/org/apache/skywalking/oap/server/configuration/consul/ConsulConfigurationWatcherRegisterTest.java
index 8403131377..7d1dc5a80f 100644
--- 
a/oap-server/server-configuration/configuration-consul/src/test/java/org/apache/skywalking/oap/server/configuration/consul/ConsulConfigurationWatcherRegisterTest.java
+++ 
b/oap-server/server-configuration/configuration-consul/src/test/java/org/apache/skywalking/oap/server/configuration/consul/ConsulConfigurationWatcherRegisterTest.java
@@ -30,8 +30,8 @@ import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockedStatic;
 import org.mockito.junit.jupiter.MockitoExtension;
-import org.powermock.reflect.Whitebox;
 
+import java.lang.reflect.Field;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -46,8 +46,8 @@ import static org.mockito.Mockito.when;
 
 @ExtendWith(MockitoExtension.class)
 @SuppressWarnings({
-    "unchecked",
-    "OptionalGetWithoutIsPresent"
+        "unchecked",
+        "OptionalGetWithoutIsPresent"
 })
 public class ConsulConfigurationWatcherRegisterTest {
     @Mock
@@ -56,11 +56,15 @@ public class ConsulConfigurationWatcherRegisterTest {
     private ConcurrentHashMap<String, Optional<String>> configItemKeyedByName;
 
     @Test
-    public void shouldUpdateCachesWhenNotified() {
+    public void shouldUpdateCachesWhenNotified() throws Exception {
         cacheByKey = new ConcurrentHashMap<>();
         configItemKeyedByName = new ConcurrentHashMap<>();
-        Whitebox.setInternalState(register, "cachesByKey", cacheByKey);
-        Whitebox.setInternalState(register, "configItemKeyedByName", 
configItemKeyedByName);
+        Field cachesField = 
ConsulConfigurationWatcherRegister.class.getDeclaredField("cachesByKey");
+        cachesField.setAccessible(true);
+        cachesField.set(register, cacheByKey);
+        Field itemsField = 
ConsulConfigurationWatcherRegister.class.getDeclaredField("configItemKeyedByName");
+        itemsField.setAccessible(true);
+        itemsField.set(register, configItemKeyedByName);
 
         KVCache cache1 = mock(KVCache.class);
         KVCache cache2 = mock(KVCache.class);
@@ -105,14 +109,18 @@ public class ConsulConfigurationWatcherRegisterTest {
     }
 
     @Test
-    public void shouldUnsubscribeWhenKeyRemoved() {
+    public void shouldUnsubscribeWhenKeyRemoved() throws Exception {
         cacheByKey = new ConcurrentHashMap<>();
         KVCache existedCache = mock(KVCache.class);
         cacheByKey.put("existedKey", existedCache);
 
         configItemKeyedByName = new ConcurrentHashMap<>();
-        Whitebox.setInternalState(register, "cachesByKey", cacheByKey);
-        Whitebox.setInternalState(register, "configItemKeyedByName", 
configItemKeyedByName);
+        Field cachesField = 
ConsulConfigurationWatcherRegister.class.getDeclaredField("cachesByKey");
+        cachesField.setAccessible(true);
+        cachesField.set(register, cacheByKey);
+        Field itemsField = 
ConsulConfigurationWatcherRegister.class.getDeclaredField("configItemKeyedByName");
+        itemsField.setAccessible(true);
+        itemsField.set(register, configItemKeyedByName);
 
         KVCache cache1 = mock(KVCache.class);
         KVCache cache2 = mock(KVCache.class);
diff --git 
a/oap-server/server-configuration/configuration-nacos/src/test/java/org/apache/skywalking/oap/server/configuration/nacos/NacosConfigWatcherRegisterTest.java
 
b/oap-server/server-configuration/configuration-nacos/src/test/java/org/apache/skywalking/oap/server/configuration/nacos/NacosConfigWatcherRegisterTest.java
index f2497ab950..35efbd467b 100644
--- 
a/oap-server/server-configuration/configuration-nacos/src/test/java/org/apache/skywalking/oap/server/configuration/nacos/NacosConfigWatcherRegisterTest.java
+++ 
b/oap-server/server-configuration/configuration-nacos/src/test/java/org/apache/skywalking/oap/server/configuration/nacos/NacosConfigWatcherRegisterTest.java
@@ -19,12 +19,12 @@
 package org.apache.skywalking.oap.server.configuration.nacos;
 
 import com.alibaba.nacos.api.config.ConfigService;
-import com.alibaba.nacos.api.exception.NacosException;
+
 import com.google.common.collect.Sets;
 import org.apache.skywalking.oap.server.configuration.api.ConfigTable;
 import org.junit.jupiter.api.Test;
-import org.powermock.reflect.Whitebox;
 
+import java.lang.reflect.Field;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -35,7 +35,7 @@ import static org.mockito.Mockito.when;
 
 public class NacosConfigWatcherRegisterTest {
     @Test
-    public void shouldReadConfigs() throws NacosException {
+    public void shouldReadConfigs() throws Exception {
         final String group = "skywalking";
         final String testKey1 = "agent-analyzer.default.slowDBAccessThreshold";
         final String testVal1 = "test";
@@ -51,7 +51,9 @@ public class NacosConfigWatcherRegisterTest {
         when(mockConfigService.getConfig(testKey1, group, 
1000)).thenReturn(testVal1);
         when(mockConfigService.getConfig(testKey2, group, 
1000)).thenReturn(testVal2);
 
-        Whitebox.setInternalState(mockRegister, "configService", 
mockConfigService);
+        Field configServiceField = 
NacosConfigWatcherRegister.class.getDeclaredField("configService");
+        configServiceField.setAccessible(true);
+        configServiceField.set(mockRegister, mockConfigService);
 
         final ConfigTable configTable = 
mockRegister.readConfig(Sets.newHashSet(testKey1, testKey2)).get();
 
diff --git 
a/oap-server/server-configuration/configuration-zookeeper/src/test/java/org/apache/skywalking/oap/server/configuration/zookeeper/ut/ZookeeperConfigWatcherRegisterTestCase.java
 
b/oap-server/server-configuration/configuration-zookeeper/src/test/java/org/apache/skywalking/oap/server/configuration/zookeeper/ut/ZookeeperConfigWatcherRegisterTestCase.java
index ce6f6f9d0a..41a8928b98 100644
--- 
a/oap-server/server-configuration/configuration-zookeeper/src/test/java/org/apache/skywalking/oap/server/configuration/zookeeper/ut/ZookeeperConfigWatcherRegisterTestCase.java
+++ 
b/oap-server/server-configuration/configuration-zookeeper/src/test/java/org/apache/skywalking/oap/server/configuration/zookeeper/ut/ZookeeperConfigWatcherRegisterTestCase.java
@@ -24,13 +24,14 @@ import 
org.apache.curator.framework.recipes.cache.PathChildrenCache;
 import org.apache.skywalking.oap.server.configuration.api.ConfigTable;
 import 
org.apache.skywalking.oap.server.configuration.zookeeper.ZookeeperServerSettings;
 import org.junit.jupiter.api.Test;
-import org.powermock.reflect.Whitebox;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
+import java.lang.reflect.Field;
+
 public class ZookeeperConfigWatcherRegisterTestCase {
     @Test
     public void TestCase() throws Exception {
@@ -46,7 +47,9 @@ public class ZookeeperConfigWatcherRegisterTestCase {
         when(mockPathChildrenCache.getCurrentData(namespace + "/" + 
key)).thenReturn(new ChildData(namespace + "/" + key, null, value
             .getBytes()));
 
-        Whitebox.setInternalState(mockRegister, "childrenCache", 
mockPathChildrenCache);
+        Field childrenCacheField = 
MockZookeeperConfigWatcherRegister.class.getDeclaredField("childrenCache");
+        childrenCacheField.setAccessible(true);
+        childrenCacheField.set(mockRegister, mockPathChildrenCache);
 
         final ConfigTable configTable = 
mockRegister.readConfig(Sets.newHashSet(key)).get();
 
diff --git 
a/oap-server/server-configuration/grpc-configuration-sync/src/test/java/org/apache/skywalking/oap/server/configuration/grpc/GRPCConfigurationTest.java
 
b/oap-server/server-configuration/grpc-configuration-sync/src/test/java/org/apache/skywalking/oap/server/configuration/grpc/GRPCConfigurationTest.java
index 84f64e7c23..83f262588c 100644
--- 
a/oap-server/server-configuration/grpc-configuration-sync/src/test/java/org/apache/skywalking/oap/server/configuration/grpc/GRPCConfigurationTest.java
+++ 
b/oap-server/server-configuration/grpc-configuration-sync/src/test/java/org/apache/skywalking/oap/server/configuration/grpc/GRPCConfigurationTest.java
@@ -31,9 +31,8 @@ import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Timeout;
-import org.powermock.reflect.Whitebox;
 
-import java.io.IOException;
+import java.lang.reflect.Field;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
@@ -56,7 +55,7 @@ public class GRPCConfigurationTest {
     private MutableHandlerRegistry serviceRegistry;
 
     @BeforeEach
-    public void before() throws IOException {
+    public void before() throws Exception {
         serviceRegistry = new MutableHandlerRegistry();
         final String name = UUID.randomUUID().toString();
         InProcessServerBuilder serverBuilder =
@@ -76,7 +75,9 @@ public class GRPCConfigurationTest {
         provider = new GRPCConfigurationProvider();
         register = new GRPCConfigWatcherRegister(settings);
         ConfigurationServiceGrpc.ConfigurationServiceBlockingStub blockingStub 
= ConfigurationServiceGrpc.newBlockingStub(channel);
-        Whitebox.setInternalState(register, "stub", blockingStub);
+        Field stubField = 
GRPCConfigWatcherRegister.class.getDeclaredField("stub");
+        stubField.setAccessible(true);
+        stubField.set(register, blockingStub);
         initWatcher();
         assertNotNull(provider);
     }
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsStreamProcessor.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsStreamProcessor.java
index c405bb5b37..2c570dbdbf 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsStreamProcessor.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsStreamProcessor.java
@@ -58,7 +58,7 @@ public class MetricsStreamProcessor implements 
StreamProcessor<Metrics> {
     /**
      * Singleton instance.
      */
-    private final static MetricsStreamProcessor PROCESSOR = new 
MetricsStreamProcessor();
+    private static final MetricsStreamProcessor PROCESSOR = new 
MetricsStreamProcessor();
 
     /**
      * Worker table hosts all entrance workers.
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/data/LimitedSizeBufferedDataTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/data/LimitedSizeBufferedDataTest.java
index 0984aa72a0..76acd39518 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/data/LimitedSizeBufferedDataTest.java
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/data/LimitedSizeBufferedDataTest.java
@@ -18,6 +18,8 @@
 
 package org.apache.skywalking.oap.server.core.analysis.data;
 
+import java.util.List;
+
 import org.apache.skywalking.oap.server.core.analysis.topn.TopN;
 import org.apache.skywalking.oap.server.core.storage.StorageID;
 import org.junit.jupiter.api.Assertions;
@@ -49,8 +51,15 @@ public class LimitedSizeBufferedDataTest {
             9,
             4
         };
+        List<MockStorageData> result = collection.read();
+        result.sort((a, b) -> {
+            if (a.getTimestamp() != b.getTimestamp()) {
+                return Long.compare(a.getTimestamp(), b.getTimestamp());
+            }
+            return Long.compare(a.getLatency(), b.getLatency());
+        });
         int i = 0;
-        for (MockStorageData data : collection.read()) {
+        for (MockStorageData data : result) {
             Assertions.assertEquals(expected[i++], data.latency);
         }
     }
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystemTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystemTest.java
index 0610661bbe..7055511c2a 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystemTest.java
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystemTest.java
@@ -20,17 +20,18 @@ package 
org.apache.skywalking.oap.server.core.analysis.meter;
 
 import org.apache.skywalking.oap.server.core.analysis.StreamDefinition;
 import 
org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
-import org.apache.skywalking.oap.server.core.storage.StorageException;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
+import org.mockito.MockedStatic;
 import org.mockito.Mockito;
 import org.mockito.junit.jupiter.MockitoExtension;
-import org.powermock.reflect.Whitebox;
 
+import java.lang.reflect.Field;
 import java.util.Map;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -42,17 +43,27 @@ public class MeterSystemTest {
     @Mock
     private ModuleManager moduleManager;
     private MeterSystem meterSystem;
+    private MockedStatic<MetricsStreamProcessor> mockedProcessor;
+    private MetricsStreamProcessor processorMock;
 
     @BeforeEach
-    public void setup() throws StorageException {
+    public void setup() throws Exception {
         meterSystem = spy(new MeterSystem(moduleManager));
-        Whitebox.setInternalState(MetricsStreamProcessor.class, "PROCESSOR",
-                                  
Mockito.spy(MetricsStreamProcessor.getInstance()));
-        doNothing().when(MetricsStreamProcessor.getInstance()).create(any(), 
(StreamDefinition) any(), any());
+        processorMock = Mockito.mock(MetricsStreamProcessor.class);
+        mockedProcessor = Mockito.mockStatic(MetricsStreamProcessor.class);
+        
mockedProcessor.when(MetricsStreamProcessor::getInstance).thenReturn(processorMock);
+        doNothing().when(processorMock).create(any(), (StreamDefinition) 
any(), any());
+    }
+
+    @AfterEach
+    public void tearDown() {
+        if (mockedProcessor != null) {
+            mockedProcessor.close();
+        }
     }
 
     @Test
-    public void testCreate() {
+    public void testCreate() throws Exception {
         // validate with same name, function and scope types
         meterSystem.create("test_meter", "avg", ScopeType.SERVICE);
         validateMeterDefinition("test_meter", Long.class, ScopeType.SERVICE);
@@ -76,11 +87,18 @@ public class MeterSystemTest {
         }
     }
 
-    private void validateMeterDefinition(String meterName, Class<?> dataType, 
ScopeType type) {
-        Map<String, ?> meterPrototypes = 
Whitebox.getInternalState(meterSystem, "meterPrototypes");
+    private void validateMeterDefinition(String meterName, Class<?> dataType, 
ScopeType type) throws Exception {
+        Field meterPrototypesField = 
MeterSystem.class.getDeclaredField("meterPrototypes");
+        meterPrototypesField.setAccessible(true);
+        @SuppressWarnings("unchecked")
+        Map<String, ?> meterPrototypes = (Map<String, ?>) 
meterPrototypesField.get(meterSystem);
         Object meterDefinition = meterPrototypes.get(meterName);
-        Class<?> realDataType = Whitebox.getInternalState(meterDefinition, 
"dataType");
-        ScopeType realScopeTypes = Whitebox.getInternalState(meterDefinition, 
"scopeType");
+        Field dataTypeField = 
meterDefinition.getClass().getDeclaredField("dataType");
+        dataTypeField.setAccessible(true);
+        Class<?> realDataType = (Class<?>) dataTypeField.get(meterDefinition);
+        Field scopeTypeField = 
meterDefinition.getClass().getDeclaredField("scopeType");
+        scopeTypeField.setAccessible(true);
+        ScopeType realScopeTypes = (ScopeType) 
scopeTypeField.get(meterDefinition);
 
         Assertions.assertEquals(dataType, realDataType);
         Assertions.assertEquals(type, realScopeTypes);
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/hierarchy/HierarchyQueryServiceTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/hierarchy/HierarchyQueryServiceTest.java
index f0310eac0d..4d0b2f09d7 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/hierarchy/HierarchyQueryServiceTest.java
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/hierarchy/HierarchyQueryServiceTest.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.hierarchy;
 
+import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
 import org.apache.skywalking.oap.server.core.query.HierarchyQueryService;
@@ -27,7 +28,6 @@ import 
org.apache.skywalking.oap.server.core.query.type.ServiceHierarchy;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.powermock.reflect.Whitebox;
 
 import static org.mockito.Mockito.mock;
 
@@ -48,8 +48,11 @@ public class HierarchyQueryServiceTest {
 
     @Test
     public void testFilterConjecturableRelations() throws Exception {
-        ServiceHierarchy hierarchy = Whitebox.invokeMethod(
-            hierarchyQueryService, "filterConjecturableRelations", 
mockCache(), invokeBuildServiceRelation(), 10);
+        Method method = 
HierarchyQueryService.class.getDeclaredMethod("filterConjecturableRelations",
+                Map.class, ServiceHierarchy.class, int.class);
+        method.setAccessible(true);
+        ServiceHierarchy hierarchy = (ServiceHierarchy) 
method.invoke(hierarchyQueryService, mockCache(),
+                invokeBuildServiceRelation(), 10);
         Assertions.assertEquals(5, hierarchy.getRelations().size());
         Assertions.assertEquals(mockHierarchy(true), hierarchy);
     }
@@ -58,10 +61,12 @@ public class HierarchyQueryServiceTest {
         ServiceHierarchy hierarchy = new ServiceHierarchy();
         HierarchyRelatedService serviceA = new HierarchyRelatedService();
         serviceA.setId("A");
-        Whitebox.invokeMethod(
-            hierarchyQueryService, "buildServiceRelation", mockCache(), 
hierarchy, serviceA, 10,
-            HierarchyQueryService.HierarchyDirection.All
-        );
+        Method method = 
HierarchyQueryService.class.getDeclaredMethod("buildServiceRelation",
+                Map.class, ServiceHierarchy.class, 
HierarchyRelatedService.class, int.class,
+                HierarchyQueryService.HierarchyDirection.class);
+        method.setAccessible(true);
+        method.invoke(hierarchyQueryService, mockCache(), hierarchy, serviceA, 
10,
+                HierarchyQueryService.HierarchyDirection.All);
         return hierarchy;
     }
 
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/query/ServiceTopologyBuilderTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/query/ServiceTopologyBuilderTest.java
index a643a668c0..a9dbc24a06 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/query/ServiceTopologyBuilderTest.java
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/query/ServiceTopologyBuilderTest.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.query;
 
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
@@ -42,7 +43,6 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
-import org.powermock.reflect.Whitebox;
 
 import static org.mockito.Mockito.when;
 
@@ -73,11 +73,13 @@ public class ServiceTopologyBuilderTest {
 
     @SneakyThrows
     @Test
-    public void testServiceTopologyBuild() {
+    public void testServiceTopologyBuild() throws Exception {
         Service svrA = getSvrA();
         Service svrB = getSvrB();
         final ServiceTopologyBuilder serviceTopologyBuilder = new 
ServiceTopologyBuilder(moduleManager);
-        Whitebox.setInternalState(serviceTopologyBuilder, 
"metadataQueryService", metadataQueryService);
+        Field metadataQueryServiceField = 
ServiceTopologyBuilder.class.getDeclaredField("metadataQueryService");
+        metadataQueryServiceField.setAccessible(true);
+        metadataQueryServiceField.set(serviceTopologyBuilder, 
metadataQueryService);
         when(metadataQueryService.getService(svrA.getId())).thenReturn(svrA);
         when(metadataQueryService.getService(svrB.getId())).thenReturn(svrB);
         List<Call.CallDetail> serviceRelationClientCalls = new ArrayList<>();
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManagerTestCase.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManagerTestCase.java
index 0d0239ba2d..93b6194829 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManagerTestCase.java
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManagerTestCase.java
@@ -23,6 +23,7 @@ import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.cluster.ClusterModule;
 import org.apache.skywalking.oap.server.core.cluster.ClusterNodesQuery;
 import org.apache.skywalking.oap.server.core.cluster.RemoteInstance;
+import org.apache.skywalking.oap.server.core.status.ServerStatusService;
 import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
 import org.apache.skywalking.oap.server.telemetry.api.GaugeMetrics;
 import org.apache.skywalking.oap.server.telemetry.api.MetricsCreator;
@@ -68,6 +69,8 @@ public class RemoteClientManagerTestCase {
 
         ModuleDefineTesting coreModuleDefine = new ModuleDefineTesting();
         moduleManager.put(CoreModule.NAME, coreModuleDefine);
+        ServerStatusService serverStatusService = 
mock(ServerStatusService.class);
+        
coreModuleDefine.provider().registerServiceImplementation(ServerStatusService.class,
 serverStatusService);
 
         this.clusterNodesQuery = mock(ClusterNodesQuery.class);
         
clusterModuleDefine.provider().registerServiceImplementation(ClusterNodesQuery.class,
 clusterNodesQuery);
diff --git 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/storage/PersistenceTimerTest.java
 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/storage/PersistenceTimerTest.java
index 2897f28d67..2bb9f35462 100644
--- 
a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/storage/PersistenceTimerTest.java
+++ 
b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/storage/PersistenceTimerTest.java
@@ -33,8 +33,8 @@ import 
org.apache.skywalking.oap.server.telemetry.api.MetricsCreator;
 import org.apache.skywalking.oap.server.telemetry.none.MetricsCreatorNoop;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
-import org.powermock.reflect.Whitebox;
 
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -51,7 +51,7 @@ public class PersistenceTimerTest {
 
     @Test
     public void testExtractDataAndSave() throws Exception {
-        Set<PrepareRequest> result = new HashSet();
+        Set<PrepareRequest> result = new HashSet<>();
         int count = 101;
         int workCount = 10;
         CoreModuleConfig moduleConfig = new CoreModuleConfig();
@@ -82,7 +82,10 @@ public class PersistenceTimerTest {
         PersistenceTimer.INSTANCE.isStarted = true;
 
         PersistenceTimer.INSTANCE.start(moduleManager, moduleConfig);
-        CompletableFuture<Void> f = 
Whitebox.invokeMethod(PersistenceTimer.INSTANCE, "extractDataAndSave", 
iBatchDAO);
+        Method method = 
PersistenceTimer.class.getDeclaredMethod("extractDataAndSave", IBatchDAO.class);
+        method.setAccessible(true);
+        @SuppressWarnings("unchecked")
+        CompletableFuture<Void> f = (CompletableFuture<Void>) 
method.invoke(PersistenceTimer.INSTANCE, iBatchDAO);
         f.join();
 
         Assertions.assertEquals(count * workCount * 2, result.size());
diff --git 
a/oap-server/server-library/library-client/src/test/java/org/apache/skywalking/library/elasticsearch/bulk/ElasticSearchIT.java
 
b/oap-server/server-library/library-client/src/test/java/org/apache/skywalking/library/elasticsearch/bulk/ElasticSearchIT.java
index 1cf99af3bf..bbe471b178 100644
--- 
a/oap-server/server-library/library-client/src/test/java/org/apache/skywalking/library/elasticsearch/bulk/ElasticSearchIT.java
+++ 
b/oap-server/server-library/library-client/src/test/java/org/apache/skywalking/library/elasticsearch/bulk/ElasticSearchIT.java
@@ -44,10 +44,10 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
 import org.mockito.Mockito;
-import org.powermock.reflect.Whitebox;
 import org.testcontainers.elasticsearch.ElasticsearchContainer;
 import org.testcontainers.utility.DockerImageName;
 
+import java.lang.reflect.Field;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
@@ -99,7 +99,9 @@ public class ElasticSearchIT {
         Mockito.when(telemetryProvider.getService(MetricsCreator.class))
                .thenReturn(new MetricsCreatorNoop());
         TelemetryModule telemetryModule = Mockito.spy(TelemetryModule.class);
-        Whitebox.setInternalState(telemetryModule, "loadedProvider", 
telemetryProvider);
+        Field loadedProviderField = 
ModuleDefine.class.getDeclaredField("loadedProvider");
+        loadedProviderField.setAccessible(true);
+        loadedProviderField.set(telemetryModule, telemetryProvider);
         
Mockito.when(moduleManager.find(TelemetryModule.NAME)).thenReturn(telemetryModule);
     }
 
diff --git 
a/oap-server/server-library/library-util/src/test/java/org/apache/skywalking/oap/server/library/util/FieldsHelperTest.java
 
b/oap-server/server-library/library-util/src/test/java/org/apache/skywalking/oap/server/library/util/FieldsHelperTest.java
index ed1e9d9efc..213dec5151 100644
--- 
a/oap-server/server-library/library-util/src/test/java/org/apache/skywalking/oap/server/library/util/FieldsHelperTest.java
+++ 
b/oap-server/server-library/library-util/src/test/java/org/apache/skywalking/oap/server/library/util/FieldsHelperTest.java
@@ -24,9 +24,9 @@ import lombok.Data;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
-import org.powermock.reflect.Whitebox;
 
 import java.io.ByteArrayInputStream;
+import java.lang.reflect.Field;
 import java.util.Arrays;
 import java.util.Collection;
 
@@ -74,8 +74,10 @@ public class FieldsHelperTest {
     }
 
     @BeforeEach
-    public void setUp() {
-        Whitebox.setInternalState(FieldsHelper.forClass(ServiceInfo.class), 
"initialized", false);
+    public void setUp() throws Exception {
+        Field initializedField = 
FieldsHelper.class.getDeclaredField("initialized");
+        initializedField.setAccessible(true);
+        initializedField.set(FieldsHelper.forClass(ServiceInfo.class), false);
     }
 
     @ParameterizedTest(name = "{0}")

Reply via email to