From d384f063573a19d9291c7b68e500c1f3d39bc9b5 Mon Sep 17 00:00:00 2001 From: Julien Herr Date: Tue, 25 Aug 2026 11:57:59 +0200 Subject: [PATCH] refactor(internal): deprecate the implementations of deprecated contracts IClass deprecated getInstances, getInstanceHashCodes and addInstance in 7.10.0, but TestClass, ClassImpl and NoOpTestClass carried on implementing them unmarked. Every implementation, and every call delegating to the next one down, therefore read as a fresh use of a deprecated API. Marking the implementations states what is already true of the contract they serve. getInstanceHashCodes is the awkward one: the same body also implements IObject.getInstanceHashCodes, which is current and still reached through ITestNGMethod. A comment at each of the three sites says so, because the annotation on its own would read as if the whole method were dead. The annotated types are package-private or live in org.testng.internal, which javadoc already excludes, so no published API changes shape. TestNG also read two defaults off CommandLineArgs, a class its own javadoc schedules for removal in 8.0. Those values are runner defaults rather than CLI ones -- the CLI overwrites both unconditionally -- so TestNG now declares them itself alongside DEFAULT_OUTPUTDIR. The main source set ends up free of deprecation warnings without a single suppression. --- testng-core/src/main/java/org/testng/TestClass.java | 5 +++++ testng-core/src/main/java/org/testng/TestNG.java | 10 ++++++++-- .../src/main/java/org/testng/internal/ClassImpl.java | 5 +++++ .../main/java/org/testng/internal/NoOpTestClass.java | 4 ++++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/testng-core/src/main/java/org/testng/TestClass.java b/testng-core/src/main/java/org/testng/TestClass.java index 0a0de5b29..115b5d5cb 100644 --- a/testng-core/src/main/java/org/testng/TestClass.java +++ b/testng-core/src/main/java/org/testng/TestClass.java @@ -148,11 +148,13 @@ private void initTestClassesAndInstances() { } } + @Deprecated @Override public Object[] getInstances(boolean create) { return iClass.getInstances(create); } + @Deprecated @Override public Object[] getInstances(boolean create, @Nullable String errorMsgPrefix) { return iClass.getInstances(create, this.m_errorMsgPrefix); @@ -163,11 +165,14 @@ public IObject.IdentifiableObject[] getObjects(boolean create, @Nullable String return IObject.objects(iClass, create, errorMsgPrefix); } + // Deprecated as IClass.getInstanceHashCodes(); the IObject method it also serves is current. + @Deprecated @Override public long[] getInstanceHashCodes() { return IObject.instanceHashCodes(iClass); } + @Deprecated @Override public void addInstance(Object instance) { iClass.addInstance(instance); diff --git a/testng-core/src/main/java/org/testng/TestNG.java b/testng-core/src/main/java/org/testng/TestNG.java index 2989c251f..ff011bacc 100644 --- a/testng-core/src/main/java/org/testng/TestNG.java +++ b/testng-core/src/main/java/org/testng/TestNG.java @@ -123,6 +123,12 @@ public class TestNG { /** The default name of the result's output directory (keep public, used by Eclipse). */ public static final String DEFAULT_OUTPUTDIR = "test-output"; + /** The suite file looked up inside a jar when none was named. */ + private static final String DEFAULT_XML_PATH_IN_JAR = "testng.xml"; + + /** How many suites run at once when none was asked for: one, so suites run sequentially. */ + private static final Integer DEFAULT_SUITE_THREAD_POOL_SIZE = 1; + private static @Nullable TestNG m_instance; private @Nullable List m_commandLineMethods; @@ -175,7 +181,7 @@ public class TestNG { private @Nullable String m_jarPath; /** The path of the testng.xml file inside the jar file */ - private String m_xmlPathInJar = CommandLineArgs.XML_PATH_IN_JAR_DEFAULT; + private String m_xmlPathInJar = DEFAULT_XML_PATH_IN_JAR; private List m_stringSuites = new ArrayList<>(); private final List> m_listenerClasses = new ArrayList<>(); @@ -876,7 +882,7 @@ public List getSuiteListeners() { private boolean m_ignoreMissedTestNames; - private Integer m_suiteThreadPoolSize = CommandLineArgs.SUITE_THREAD_POOL_SIZE_DEFAULT; + private Integer m_suiteThreadPoolSize = DEFAULT_SUITE_THREAD_POOL_SIZE; private boolean m_randomizeSuites = Boolean.FALSE; diff --git a/testng-core/src/main/java/org/testng/internal/ClassImpl.java b/testng-core/src/main/java/org/testng/internal/ClassImpl.java index 34fafdcae..3f6fe5c55 100644 --- a/testng-core/src/main/java/org/testng/internal/ClassImpl.java +++ b/testng-core/src/main/java/org/testng/internal/ClassImpl.java @@ -80,6 +80,8 @@ public Class getRealClass() { return m_class; } + // Deprecated as IClass.getInstanceHashCodes(); the IObject method it also serves is current. + @Deprecated @Override public long @Nullable [] getInstanceHashCodes() { return m_instanceHashCodes; @@ -120,11 +122,13 @@ public XmlTest getXmlTest() { return m_defaultInstance; } + @Deprecated @Override public Object[] getInstances(boolean create) { return getInstances(create, ""); } + @Deprecated @Override public Object[] getInstances(boolean create, @Nullable String errorMsgPrefix) { return Arrays.stream(getObjects(create, errorMsgPrefix)) @@ -163,6 +167,7 @@ public String toString() { return Objects.toStringHelper(getClass()).add("class", m_class.getName()).toString(); } + @Deprecated @Override public void addInstance(Object instance) { addObject(new IdentifiableObject(instance)); diff --git a/testng-core/src/main/java/org/testng/internal/NoOpTestClass.java b/testng-core/src/main/java/org/testng/internal/NoOpTestClass.java index d910363e1..cea8ed715 100644 --- a/testng-core/src/main/java/org/testng/internal/NoOpTestClass.java +++ b/testng-core/src/main/java/org/testng/internal/NoOpTestClass.java @@ -127,11 +127,14 @@ public ITestNGMethod[] getAfterGroupsMethods() { } /** @see org.testng.internal.IObject#getInstanceHashCodes() */ + // Deprecated as IClass.getInstanceHashCodes(); the IObject method it also serves is current. + @Deprecated @Override public long[] getInstanceHashCodes() { return m_instanceHashes; } + @Deprecated @Override public Object[] getInstances(boolean reuse) { return m_instances; @@ -152,6 +155,7 @@ public Class getRealClass() { return testClass; } + @Deprecated @Override public void addInstance(Object instance) {}