This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit ac609155c5763d91aaa8f0761e4294f53799d21c Author: Andrus Adamchik <[email protected]> AuthorDate: Thu May 14 10:40:24 2026 -0400 tests cleanup - unwinding DI --- .../org/apache/cayenne/access/ObjectStoreGCIT.java | 2 +- .../org/apache/cayenne/unit/CayenneTestsEnv.java | 77 ++++++++++++++-------- .../unit/RuntimeCaseDataDomainProvider.java | 71 -------------------- 3 files changed, 49 insertions(+), 101 deletions(-) diff --git a/cayenne/src/test/java/org/apache/cayenne/access/ObjectStoreGCIT.java b/cayenne/src/test/java/org/apache/cayenne/access/ObjectStoreGCIT.java index 0eb6b0243..cc1a818a5 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/ObjectStoreGCIT.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/ObjectStoreGCIT.java @@ -34,7 +34,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class ObjectStoreGCIT { @RegisterExtension - static final CayenneTestsEnv env = CayenneTestsEnv.forProject(CayenneProjects.TESTMAP_PROJECT).withWeakReferenceStrategy(); + static final CayenneTestsEnv env = CayenneTestsEnv.forProject(CayenneProjects.TESTMAP_PROJECT).withWeakReferences(); private DataContext context; diff --git a/cayenne/src/test/java/org/apache/cayenne/unit/CayenneTestsEnv.java b/cayenne/src/test/java/org/apache/cayenne/unit/CayenneTestsEnv.java index 0d9fcc0cb..431f5bee1 100644 --- a/cayenne/src/test/java/org/apache/cayenne/unit/CayenneTestsEnv.java +++ b/cayenne/src/test/java/org/apache/cayenne/unit/CayenneTestsEnv.java @@ -23,6 +23,7 @@ import org.apache.cayenne.access.DataDomain; import org.apache.cayenne.access.DataNode; import org.apache.cayenne.configuration.Constants; import org.apache.cayenne.configuration.DataMapLoader; +import org.apache.cayenne.configuration.DataNodeDescriptor; import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.configuration.runtime.CoreModule; import org.apache.cayenne.configuration.runtime.DataNodeFactory; @@ -35,6 +36,7 @@ import org.apache.cayenne.di.Module; import org.apache.cayenne.log.JdbcEventLogger; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.EntityResolver; +import org.apache.cayenne.map.Procedure; import org.apache.cayenne.runtime.CayenneRuntime; import org.apache.cayenne.test.jdbc.DbHelper; import org.apache.cayenne.test.jdbc.TableHelper; @@ -80,7 +82,7 @@ public class CayenneTestsEnv implements BeforeEachCallback, AfterEachCallback { private final String project; private final Class<?>[] extraModules; private final boolean autoClean; - private final boolean weakReferenceStrategy; + private final boolean weakReferences; // single-test scoped vars private DataContext context; @@ -88,11 +90,11 @@ public class CayenneTestsEnv implements BeforeEachCallback, AfterEachCallback { private DbCleaner dbCleaner; private CayenneRuntime runtime; - private CayenneTestsEnv(String project, Class<?>[] extraModules, boolean autoClean, boolean weakReferenceStrategy) { + private CayenneTestsEnv(String project, Class<?>[] extraModules, boolean autoClean, boolean weakReferences) { this.project = project; this.extraModules = extraModules; this.autoClean = autoClean; - this.weakReferenceStrategy = weakReferenceStrategy; + this.weakReferences = weakReferences; } public static CayenneTestsEnv forProject(String project) { @@ -100,27 +102,14 @@ public class CayenneTestsEnv implements BeforeEachCallback, AfterEachCallback { } public CayenneTestsEnv withExtraModules(Class<?>... modules) { - return new CayenneTestsEnv(project, modules, autoClean, weakReferenceStrategy); + return new CayenneTestsEnv(project, modules, autoClean, weakReferences); } - /** - * Disables the automatic {@code DBCleaner.clean()} call in {@link #beforeEach}. - * Use this when the test (or a base class) needs to perform schema-specific - * setup (e.g. break circular FKs) before cleaning. The caller is then - * responsible for invoking {@code env.dbCleaner().clean()} from its own - * {@code @BeforeEach}. - */ public CayenneTestsEnv withoutAutoClean() { - return new CayenneTestsEnv(project, extraModules, false, weakReferenceStrategy); + return new CayenneTestsEnv(project, extraModules, false, weakReferences); } - /** - * Configures the runtime with the weak-reference object-tracking strategy - * instead of the default soft-reference strategy used by other tests. Use - * for GC-sensitive tests that need objects to be collectable as soon as - * they become unreferenced. - */ - public CayenneTestsEnv withWeakReferenceStrategy() { + public CayenneTestsEnv withWeakReferences() { return new CayenneTestsEnv(project, extraModules, autoClean, true); } @@ -162,25 +151,56 @@ public class CayenneTestsEnv implements BeforeEachCallback, AfterEachCallback { } private CayenneRuntime buildRuntime() { - UnitDbAdapter unitDbAdapter = INJECTOR.getInstance(UnitDbAdapter.class); - - List<Module> modules = new ArrayList<>(); - - modules.add(new TestRuntimeOverridesModule(unitDbAdapter)); + modules.add(new TestRuntimeOverridesModule()); for (Class<?> moduleType : extraModules) { modules.add(instantiateModule(moduleType)); } - if (weakReferenceStrategy) { + if (weakReferences) { modules.add(new WeakReferenceStrategyModule()); } - return CayenneRuntime.builder() + CayenneRuntime runtime = CayenneRuntime.builder() .addConfig(project) .addModules(modules) .build(); + + synthesizeDataNodes(runtime); + + return runtime; + } + + private void synthesizeDataNodes(CayenneRuntime runtime) { + + UnitDbAdapter unitDbAdapter = unitDbAdapter(); + DataDomain domain = runtime.getDataDomain(); + DataNodeFactory dataNodeFactory = runtime.getInjector().getInstance(DataNodeFactory.class); + + DataNode lastNode = null; + for (DataMap dataMap : domain.getDataMaps()) { + DataNodeDescriptor descriptor = new DataNodeDescriptor(dataMap.getName()); + + DataNode node; + try { + node = dataNodeFactory.createDataNode(descriptor); + } catch (Exception e) { + throw new RuntimeException("Failed to create test DataNode for map " + dataMap.getName(), e); + } + node.addDataMap(dataMap); + + for (Procedure proc : dataMap.getProcedures()) { + unitDbAdapter.tweakProcedure(proc); + } + + domain.addNode(node); + lastNode = node; + } + + if (domain.getDataMaps().size() == 1) { + domain.setDefaultNode(lastNode); + } } private static Module instantiateModule(Class<?> moduleType) { @@ -255,7 +275,7 @@ public class CayenneTestsEnv implements BeforeEachCallback, AfterEachCallback { } } - private record TestRuntimeOverridesModule(UnitDbAdapter unitDbAdapter) implements Module { + private static class TestRuntimeOverridesModule implements Module { @Override public void configure(Binder binder) { @@ -264,9 +284,8 @@ public class CayenneTestsEnv implements BeforeEachCallback, AfterEachCallback { // a fresh DbAdapter per call — RuntimeCaseDbAdapterProvider is unscoped in the test injector binder.bind(DbAdapter.class).toProviderInstance(() -> INJECTOR.getInstance(DbAdapter.class)); - binder.bind(DataDomain.class).toProviderInstance(new RuntimeCaseDataDomainProvider(unitDbAdapter)); binder.bind(DataNodeFactory.class).to(CayenneTestDataNodeFactory.class); - binder.bind(UnitDbAdapter.class).toInstance(unitDbAdapter); + binder.bind(UnitDbAdapter.class).toInstance(INJECTOR.getInstance(UnitDbAdapter.class)); binder.bind(RuntimeCaseDataSourceFactory.class).toInstance(DATA_SOURCE_FACTORY); CoreModule.extend(binder) diff --git a/cayenne/src/test/java/org/apache/cayenne/unit/RuntimeCaseDataDomainProvider.java b/cayenne/src/test/java/org/apache/cayenne/unit/RuntimeCaseDataDomainProvider.java deleted file mode 100644 index be85adf71..000000000 --- a/cayenne/src/test/java/org/apache/cayenne/unit/RuntimeCaseDataDomainProvider.java +++ /dev/null @@ -1,71 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ -package org.apache.cayenne.unit; - -import org.apache.cayenne.access.DataDomain; -import org.apache.cayenne.access.DataNode; -import org.apache.cayenne.configuration.DataNodeDescriptor; -import org.apache.cayenne.configuration.runtime.DataDomainProvider; -import org.apache.cayenne.configuration.runtime.DataNodeFactory; -import org.apache.cayenne.map.DataMap; -import org.apache.cayenne.map.Procedure; -import org.apache.cayenne.unit.dba.UnitDbAdapter; - -class RuntimeCaseDataDomainProvider extends DataDomainProvider { - - private final UnitDbAdapter unitDbAdapter; - - RuntimeCaseDataDomainProvider(UnitDbAdapter unitDbAdapter) { - this.unitDbAdapter = unitDbAdapter; - - // super fields are initialized via injection - } - - @Override - protected DataDomain createAndInitDataDomain() throws Exception { - - DataDomain domain = super.createAndInitDataDomain(); - DataNode node = null; - DataNodeFactory dataNodeFactory = injector.getInstance(DataNodeFactory.class); - - for (DataMap dataMap : domain.getDataMaps()) { - - // add nodes and DataSources dynamically... - DataNodeDescriptor descriptor = new DataNodeDescriptor(dataMap.getName()); - - node = dataNodeFactory.createDataNode(descriptor); - - node.addDataMap(dataMap); - - // tweak procedures for testing... - for (Procedure proc : dataMap.getProcedures()) { - unitDbAdapter.tweakProcedure(proc); - } - - domain.addNode(node); - } - - if (domain.getDataMaps().size() == 1) { - domain.setDefaultNode(node); - } - - return domain; - } - -}
