You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2020/01/29 19:38:39 UTC

[isis] 10/25: ISIS-2273: copies jmock2 into metamodel's own test

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

danhaywood pushed a commit to branch ISIS-2062
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 93bcf46a7a4ae8d0f3fb4186ac5873375e26efa4
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Jan 29 17:46:33 2020 +0000

    ISIS-2273: copies jmock2 into metamodel's own test
    
    since used in many of its unit tests
---
 core/metamodel/pom.xml                             |  58 ++++
 .../metamodel/MetaModelContext_configTest.java     |   4 +-
 .../facets/AbstractFacetFactoryJUnit4TestCase.java |   4 +-
 .../metamodel/facets/AbstractFacetFactoryTest.java |   2 +-
 .../metamodel/facets/ObjectAdapterUtilsTest.java   |   4 +-
 .../actions/ActionMethodsFacetFactoryTest.java     |   2 +-
 .../prototype/PrototypeFacetAbstractTest.java      |   2 +-
 .../CollectionFieldMethodsFacetFactoryTest.java    |   4 +-
 .../collections/JavaCollectionFacetTest.java       |   4 +-
 .../ViewModelSemanticCheckingFacetFactoryTest.java |   4 +-
 .../object/defaults/DefaultedFacetFactoryTest.java |   2 +-
 .../DomainObjectAnnotationFacetFactoryTest.java    |   2 +-
 .../DomainObjectLayoutFactoryTest.java             |   2 +-
 .../TitleFacetViaTitleAnnotationTest.java          |   4 +-
 .../parseable/ParseableFacetUsingParserTest.java   |   4 +-
 ...eFacetAnnotationOrConfigurationFactoryTest.java |   2 +-
 .../ordering/memberorder/DeweyOrderSetTest.java    |   2 +-
 .../MemberOrderAnnotationFacetFactoryTest.java     |   2 +-
 .../memberorder/MemberOrderComparatorTest.java     |   2 +-
 ...romptStyleFacetFromPropertyAnnotation_Test.java |   2 +-
 .../PropertyAnnotationFacetFactoryTest.java        |   2 +-
 .../BigDecimalValueSemanticsProviderTest.java      |   2 +-
 .../value/BigIntValueSemanticsProviderTest.java    |   2 +-
 .../value/ByteValueSemanticsProviderTest.java      |   2 +-
 .../value/DoubleValueSemanticsProviderTest.java    |   2 +-
 .../value/FloatValueSemanticsProviderTest.java     |   2 +-
 .../ImageValueSemanticsProviderAbstractTest.java   |   6 +-
 .../value/IntValueSemanticsProviderTest.java       |   2 +-
 .../JavaSqlDateValueSemanticsProviderTest.java     |   2 +-
 .../JavaSqlTimeValueSemanticsProviderTest.java     |   2 +-
 .../JavaUtilDateValueSemanticsProviderTest.java    |   2 +-
 .../value/LongValueSemanticsProviderTest.java      |   2 +-
 .../value/ShortValueSemanticsProviderTest.java     |   2 +-
 .../ValueSemanticsProviderAbstractTestCase.java    |   6 +-
 ...odaLocalDateTimeValueSemanticsProviderTest.java |   4 +-
 ...jectAssociationPredicatesTest_visibleWhere.java |   4 +-
 .../services/appfeat/ApplicationFeatureIdTest.java |   4 +-
 .../ApplicationFeatureRepositoryDefaultTest.java   |   2 +-
 ...zerForRecoverableException_recognizes_Test.java |   4 +-
 .../metamodel/MetaModelServiceDefaultTest.java     |   4 +-
 .../spec/ObjectSpecIdTest_valueSemantics.java      |   2 +-
 .../specloader/SpecificationCacheDefaultTest.java  |   4 +-
 ...ionParameterAbstractTest_getId_and_getName.java |   5 +-
 .../specimpl/ObjectAssociationAbstractTest.java    |   4 +-
 ...ObjectAssociationAbstractTest_alwaysHidden.java |   4 +-
 .../jmocking/ImposteriserUsingCodegenPlugin.java   |  92 ++++++
 .../jmocking/Imposterisers.java}                   |  22 +-
 .../jmocking/InjectIntoJMockAction.java            |  63 ++++
 .../unittestsupport/jmocking/IsisActions.java      |  60 ++++
 .../unittestsupport/jmocking/JMockActions.java     |  86 ++++++
 .../jmocking/JUnitRuleMockery2.java                | 321 +++++++++++++++++++++
 .../unittestsupport/jmocking/MyMockomatic.java     | 110 +++++++
 .../jmocking/PostponedAction.java}                 |  30 +-
 53 files changed, 884 insertions(+), 89 deletions(-)

diff --git a/core/metamodel/pom.xml b/core/metamodel/pom.xml
index ba7c946..b821a8d 100644
--- a/core/metamodel/pom.xml
+++ b/core/metamodel/pom.xml
@@ -168,12 +168,70 @@
         </dependency>
 
         <dependency>
+            <groupId>org.apache.isis.core</groupId>
+            <artifactId>isis-core-codegen-bytebuddy</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
             <groupId>org.assertj</groupId>
             <artifactId>assertj-core</artifactId>
             <scope>test</scope>
         </dependency>
 
         <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- SPRING -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.ow2.asm</groupId>
+                    <artifactId>asm</artifactId>
+                </exclusion>
+                <exclusion>
+                    <!-- when spring-boot release lags behind spring-core release explicitly
+                        spring-test added below -->
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-test</artifactId>
+                </exclusion>
+                <exclusion>
+                    <!-- when spring-boot release lags behind spring-core release explicitly
+                        spring-test added below -->
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <!-- we use log4j-2 instead -->
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.picocontainer</groupId>
+            <artifactId>picocontainer</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-validator</artifactId>
             <version>${hibernate-validator.version}</version>
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/MetaModelContext_configTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/MetaModelContext_configTest.java
index 73c6ee8..604ed48 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/MetaModelContext_configTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/MetaModelContext_configTest.java
@@ -25,8 +25,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.unittestsupport.config.IsisConfigurationLegacy;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.IsisConfigurationLegacy;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 import lombok.val;
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
index c0d04f8..ac090f2 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
@@ -49,8 +49,8 @@ import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 public abstract class AbstractFacetFactoryJUnit4TestCase {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
index b2d37d5..ef74776 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
@@ -38,7 +38,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.security.authentication.AuthenticationSession;
 import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
 
 import junit.framework.TestCase;
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ObjectAdapterUtilsTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ObjectAdapterUtilsTest.java
index 74398d1..6556569 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ObjectAdapterUtilsTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ObjectAdapterUtilsTest.java
@@ -28,8 +28,8 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 public class ObjectAdapterUtilsTest {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
index a51119f..ddec82e 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
@@ -53,7 +53,7 @@ import org.apache.isis.core.metamodel.facets.param.defaults.methodnum.ActionPara
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.testspec.ObjectSpecificationStub;
 import org.apache.isis.core.security.authentication.AuthenticationSession;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
 
 import lombok.val;
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/prototype/PrototypeFacetAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/prototype/PrototypeFacetAbstractTest.java
index d2d3755..940454a 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/prototype/PrototypeFacetAbstractTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/prototype/PrototypeFacetAbstractTest.java
@@ -27,7 +27,7 @@ import static org.junit.Assert.assertEquals;
 import org.apache.isis.core.commons.internal.environment.DeploymentType;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
 
 public class PrototypeFacetAbstractTest {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
index f0d1b15..dba439d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
@@ -50,8 +50,8 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.facets.collections.clear.CollectionClearFacetFactory;
 import org.apache.isis.core.metamodel.facets.collections.clear.CollectionClearFacetViaAccessor;
 import org.apache.isis.core.metamodel.facets.collections.clear.CollectionClearFacetViaClearMethod;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 import lombok.val;
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/JavaCollectionFacetTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/JavaCollectionFacetTest.java
index 71d6fd0..75d84ab 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/JavaCollectionFacetTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/JavaCollectionFacetTest.java
@@ -39,8 +39,8 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.javautilcollection.JavaCollectionFacet;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 public class JavaCollectionFacetTest {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactoryTest.java
index d96a1ee..cfd8221 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactoryTest.java
@@ -41,8 +41,8 @@ import org.apache.isis.core.metamodel.progmodel.ProgrammingModelAbstract;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModelInitFilterDefault;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorAbstract;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
-import org.apache.isis.core.unittestsupport.config._Config;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
 
 import lombok.val;
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetFactoryTest.java
index 0359702..01bae00 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/defaults/DefaultedFacetFactoryTest.java
@@ -24,7 +24,7 @@ import org.apache.isis.applib.annotation.Defaulted;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
 import org.apache.isis.core.metamodel.facets.object.defaults.annotcfg.DefaultedFacetAnnotationElseConfigurationFactory;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 public class DefaultedFacetFactoryTest extends AbstractFacetFactoryTest {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
index b7b63bd..319b294 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
@@ -61,7 +61,7 @@ import org.apache.isis.core.metamodel.facets.object.publishedobject.PublishedObj
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.choices.ChoicesFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 import lombok.val;
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
index ff7aa04..177b31a 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
@@ -47,7 +47,7 @@ import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaPosition;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.facets.object.plural.PluralFacet;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 public class DomainObjectLayoutFactoryTest extends AbstractFacetFactoryJUnit4TestCase {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
index 722563d..b4c933e 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
@@ -41,8 +41,8 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 public class TitleFacetViaTitleAnnotationTest {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java
index 71be3d6..5e28408 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java
@@ -37,8 +37,8 @@ import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.parseable.parser.ParseableFacetUsingParser;
 import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 public class ParseableFacetUsingParserTest {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAnnotationOrConfigurationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAnnotationOrConfigurationFactoryTest.java
index 776f10d..98066e3 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAnnotationOrConfigurationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAnnotationOrConfigurationFactoryTest.java
@@ -35,7 +35,7 @@ import org.apache.isis.core.metamodel.facets.object.value.annotcfg.ValueFacetAnn
 import org.apache.isis.core.metamodel.facets.object.value.annotcfg.ValueFacetAnnotationOrConfigurationFactory;
 import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderUtil;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 public class ValueFacetAnnotationOrConfigurationFactoryTest extends AbstractFacetFactoryTest {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/DeweyOrderSetTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/DeweyOrderSetTest.java
index 3ba024d..0105ad0 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/DeweyOrderSetTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/DeweyOrderSetTest.java
@@ -34,7 +34,7 @@ import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.members.order.annotprop.MemberOrderFacetAnnotation;
 import org.apache.isis.core.metamodel.layout.DeweyOrderSet;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
 
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/MemberOrderAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/MemberOrderAnnotationFacetFactoryTest.java
index 9eb2c9b..b4f6318 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/MemberOrderAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/MemberOrderAnnotationFacetFactoryTest.java
@@ -35,7 +35,7 @@ import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
 import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
 import org.apache.isis.core.metamodel.facets.members.order.annotprop.MemberOrderFacetAnnotation;
 import org.apache.isis.core.metamodel.facets.members.order.annotprop.MemberOrderFacetFactory;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
 
 public class MemberOrderAnnotationFacetFactoryTest extends AbstractFacetFactoryTest {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/MemberOrderComparatorTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/MemberOrderComparatorTest.java
index 621bcd5..5766504 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/MemberOrderComparatorTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/MemberOrderComparatorTest.java
@@ -30,7 +30,7 @@ import org.apache.isis.core.commons.internal.context._Context;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.members.order.annotprop.MemberOrderFacetAnnotation;
 import org.apache.isis.core.metamodel.layout.memberorderfacet.MemberOrderComparator;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
 
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/promptstyle/PromptStyleFacetFromPropertyAnnotation_Test.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/promptstyle/PromptStyleFacetFromPropertyAnnotation_Test.java
index a819306..bac9634 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/promptstyle/PromptStyleFacetFromPropertyAnnotation_Test.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/promptstyle/PromptStyleFacetFromPropertyAnnotation_Test.java
@@ -39,7 +39,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
 import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacetAsConfigured;
 import org.apache.isis.core.metamodel.facets.properties.propertylayout.PromptStyleFacetForPropertyLayoutAnnotation;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
 
 public class PromptStyleFacetFromPropertyAnnotation_Test {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
index cdfe4af..453bc77 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
@@ -39,6 +39,7 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
 import org.apache.isis.applib.spec.Specification;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 import org.apache.isis.core.metamodel.commons.matchers.IsisMatchers;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -76,7 +77,6 @@ import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySe
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.core.unittestsupport.config._Config;
 
 import lombok.val;
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
index 20dc05e..7918946 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
@@ -32,7 +32,7 @@ import org.apache.isis.core.metamodel.context.MetaModelContextAware;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 public class BigDecimalValueSemanticsProviderTest extends ValueSemanticsProviderAbstractTestCase {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigIntValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigIntValueSemanticsProviderTest.java
index 75eaf05..3d5d5b4 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigIntValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigIntValueSemanticsProviderTest.java
@@ -32,7 +32,7 @@ import org.apache.isis.core.metamodel.context.MetaModelContextAware;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 public class BigIntValueSemanticsProviderTest extends ValueSemanticsProviderAbstractTestCase {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ByteValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ByteValueSemanticsProviderTest.java
index 41ab4b0..7ac38b2 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ByteValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ByteValueSemanticsProviderTest.java
@@ -31,7 +31,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
 import org.apache.isis.core.metamodel.facets.value.bytes.ByteValueSemanticsProviderAbstract;
 import org.apache.isis.core.metamodel.facets.value.bytes.ByteWrapperValueSemanticsProvider;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 public class ByteValueSemanticsProviderTest extends ValueSemanticsProviderAbstractTestCase {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/DoubleValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/DoubleValueSemanticsProviderTest.java
index 2faebe9..36b1f37 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/DoubleValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/DoubleValueSemanticsProviderTest.java
@@ -30,7 +30,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
 import org.apache.isis.core.metamodel.facets.value.doubles.DoubleWrapperValueSemanticsProvider;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 public class DoubleValueSemanticsProviderTest extends ValueSemanticsProviderAbstractTestCase {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/FloatValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/FloatValueSemanticsProviderTest.java
index 728c347..db9fa86 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/FloatValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/FloatValueSemanticsProviderTest.java
@@ -31,7 +31,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
 import org.apache.isis.core.metamodel.facets.value.floats.FloatValueSemanticsProviderAbstract;
 import org.apache.isis.core.metamodel.facets.value.floats.FloatWrapperValueSemanticsProvider;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 public class FloatValueSemanticsProviderTest extends ValueSemanticsProviderAbstractTestCase {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ImageValueSemanticsProviderAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ImageValueSemanticsProviderAbstractTest.java
index 104f00d..e05d5db 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ImageValueSemanticsProviderAbstractTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ImageValueSemanticsProviderAbstractTest.java
@@ -32,9 +32,9 @@ import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.value.image.ImageValueSemanticsProviderAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.unittestsupport.config.IsisConfigurationLegacy;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.config.unittestsupport.IsisConfigurationLegacy;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 public class ImageValueSemanticsProviderAbstractTest {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/IntValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/IntValueSemanticsProviderTest.java
index 76ff5b4..d3924bd 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/IntValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/IntValueSemanticsProviderTest.java
@@ -31,7 +31,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
 import org.apache.isis.core.metamodel.facets.value.integer.IntValueSemanticsProviderAbstract;
 import org.apache.isis.core.metamodel.facets.value.integer.IntWrapperValueSemanticsProvider;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 public class IntValueSemanticsProviderTest extends ValueSemanticsProviderAbstractTestCase {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaSqlDateValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaSqlDateValueSemanticsProviderTest.java
index c667fbf..cfe16c5 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaSqlDateValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaSqlDateValueSemanticsProviderTest.java
@@ -36,7 +36,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
 import org.apache.isis.core.metamodel.facets.value.datesql.JavaSqlDateValueSemanticsProvider;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 public class JavaSqlDateValueSemanticsProviderTest extends ValueSemanticsProviderAbstractTestCase {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaSqlTimeValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaSqlTimeValueSemanticsProviderTest.java
index b079f17..b1a87ac 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaSqlTimeValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaSqlTimeValueSemanticsProviderTest.java
@@ -33,7 +33,7 @@ import org.apache.isis.core.metamodel.context.MetaModelContextAware;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facets.value.timesql.JavaSqlTimeValueSemanticsProvider;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 public class JavaSqlTimeValueSemanticsProviderTest extends ValueSemanticsProviderAbstractTestCase {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaUtilDateValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaUtilDateValueSemanticsProviderTest.java
index 79dc56b..1a4954d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaUtilDateValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/JavaUtilDateValueSemanticsProviderTest.java
@@ -35,7 +35,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
 import org.apache.isis.core.metamodel.facets.value.dateutil.JavaUtilDateValueSemanticsProvider;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 public class JavaUtilDateValueSemanticsProviderTest extends ValueSemanticsProviderAbstractTestCase {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/LongValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/LongValueSemanticsProviderTest.java
index 26332d0..3a72734 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/LongValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/LongValueSemanticsProviderTest.java
@@ -31,7 +31,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
 import org.apache.isis.core.metamodel.facets.value.longs.LongValueSemanticsProviderAbstract;
 import org.apache.isis.core.metamodel.facets.value.longs.LongWrapperValueSemanticsProvider;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 public class LongValueSemanticsProviderTest extends ValueSemanticsProviderAbstractTestCase {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ShortValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ShortValueSemanticsProviderTest.java
index 2a1cc5d..0d20cca 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ShortValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ShortValueSemanticsProviderTest.java
@@ -31,7 +31,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
 import org.apache.isis.core.metamodel.facets.value.shortint.ShortValueSemanticsProviderAbstract;
 import org.apache.isis.core.metamodel.facets.value.shortint.ShortWrapperValueSemanticsProvider;
-import org.apache.isis.core.unittestsupport.config._Config;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
 
 public class ShortValueSemanticsProviderTest extends ValueSemanticsProviderAbstractTestCase {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
index fb5d10a..23b83f5 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
@@ -46,9 +46,9 @@ import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.core.metamodel.facets.object.parseable.parser.ParseableFacetUsingParser;
 import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
 import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.unittestsupport.config._Config;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 public abstract class ValueSemanticsProviderAbstractTestCase {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProviderTest.java
index f88b233..56a1ec0 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProviderTest.java
@@ -32,8 +32,8 @@ import static org.junit.Assert.assertThat;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.core.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.unittestsupport.config._Config;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.config.unittestsupport.internal._Config;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
 
 public class JodaLocalDateTimeValueSemanticsProviderTest {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/feature/ObjectAssociationPredicatesTest_visibleWhere.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/feature/ObjectAssociationPredicatesTest_visibleWhere.java
index 87b4806..73e6ce6 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/feature/ObjectAssociationPredicatesTest_visibleWhere.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/feature/ObjectAssociationPredicatesTest_visibleWhere.java
@@ -42,8 +42,8 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.WhereValueFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 @RunWith(Parameterized.class)
 public class ObjectAssociationPredicatesTest_visibleWhere {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
index 0cf2058..e027b0d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureIdTest.java
@@ -39,8 +39,8 @@ import static org.hamcrest.Matchers.lessThan;
 import static org.junit.Assert.assertThat;
 
 import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.value.ValueTypeContractTestAbstract;
+import org.apache.isis.applib.unittestsupport.ValueTypeContractTestAbstract;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
 
 public class ApplicationFeatureIdTest {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
index 9f93871..1b9aa0d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureRepositoryDefaultTest.java
@@ -56,7 +56,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
 
 public class ApplicationFeatureRepositoryDefaultTest {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/exceprecog/ExceptionRecognizerForRecoverableException_recognizes_Test.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/exceprecog/ExceptionRecognizerForRecoverableException_recognizes_Test.java
index 373a01e..737a0e1 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/exceprecog/ExceptionRecognizerForRecoverableException_recognizes_Test.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/exceprecog/ExceptionRecognizerForRecoverableException_recognizes_Test.java
@@ -28,8 +28,8 @@ import org.junit.Test;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 public class ExceptionRecognizerForRecoverableException_recognizes_Test {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefaultTest.java
index 071c385..b397b11 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefaultTest.java
@@ -53,8 +53,8 @@ import org.apache.isis.core.metamodel.spec.Hierarchical;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionDefault;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 class MetaModelServiceDefaultTest {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/ObjectSpecIdTest_valueSemantics.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/ObjectSpecIdTest_valueSemantics.java
index e324b16..da3e0d1 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/ObjectSpecIdTest_valueSemantics.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/ObjectSpecIdTest_valueSemantics.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.spec;
 import java.util.Arrays;
 import java.util.List;
 
-import org.apache.isis.core.unittestsupport.value.ValueTypeContractTestAbstract;
+import org.apache.isis.applib.unittestsupport.ValueTypeContractTestAbstract;
 
 public class ObjectSpecIdTest_valueSemantics extends ValueTypeContractTestAbstract<ObjectSpecId> {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationCacheDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationCacheDefaultTest.java
index f99aa12..4bd94f5 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationCacheDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationCacheDefaultTest.java
@@ -32,8 +32,8 @@ import static org.junit.Assert.assertThat;
 
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 import lombok.val;
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
index a72c159..6a56f12 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
@@ -40,8 +40,9 @@ import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+
 
 public class ObjectActionParameterAbstractTest_getId_and_getName {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
index a2ec67c..2e14e13 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
@@ -43,8 +43,8 @@ import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 public class ObjectAssociationAbstractTest {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
index 243c600..bae2e75 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
@@ -46,8 +46,8 @@ import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.metamodel.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
 public class ObjectAssociationAbstractTest_alwaysHidden {
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/ImposteriserUsingCodegenPlugin.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/ImposteriserUsingCodegenPlugin.java
new file mode 100644
index 0000000..e24e966
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/ImposteriserUsingCodegenPlugin.java
@@ -0,0 +1,92 @@
+/*
+ *  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
+ *
+ *        http://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.isis.core.metamodel.unittestsupport.jmocking;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+import org.jmock.api.Imposteriser;
+import org.jmock.api.Invocation;
+import org.jmock.api.Invokable;
+import org.jmock.lib.JavaReflectionImposteriser;
+
+import org.apache.isis.core.codegen.bytebuddy.services.ProxyFactoryServiceByteBuddy;
+import org.apache.isis.core.commons.internal.plugins.codegen.ProxyFactory;
+
+class ImposteriserUsingCodegenPlugin implements Imposteriser {
+
+    public static final Imposteriser INSTANCE = new ImposteriserUsingCodegenPlugin();
+
+    private final Imposteriser reflectionImposteriser = new JavaReflectionImposteriser();
+
+    private ImposteriserUsingCodegenPlugin() {
+    }
+
+
+    @Override
+    public boolean canImposterise(Class<?> mockedType) {
+
+        if(mockedType.isInterface()) {
+            return reflectionImposteriser.canImposterise(mockedType);
+        }
+
+        return !mockedType.isPrimitive() &&
+                !Modifier.isFinal(mockedType.getModifiers()) &&
+                !toStringMethodIsFinal(mockedType);
+    }
+
+    @Override
+    public <T> T imposterise(final Invokable mockObject, final Class<T> mockedType, Class<?>... ancilliaryTypes) {
+        if (!canImposterise(mockedType)) {
+            throw new IllegalArgumentException(mockedType.getName() + " cannot be imposterized (either a primitive, or a final type or has final toString method)");
+        }
+
+        if(mockedType.isInterface()) {
+            return reflectionImposteriser.imposterise(mockObject, mockedType, ancilliaryTypes);
+        }
+
+
+        final ProxyFactory<T> factory = ProxyFactory.builder(mockedType)
+                .interfaces(ancilliaryTypes)
+                .build(new ProxyFactoryServiceByteBuddy());
+
+        final boolean initialize = false;
+
+        return factory.createInstance(
+                (obj, method, args)->mockObject.invoke(new Invocation(obj, method, args)),
+                initialize);
+    }
+
+    // //////////////////////////////////////
+
+    private static boolean toStringMethodIsFinal(Class<?> type) {
+        try {
+            Method toString = type.getMethod("toString");
+            return Modifier.isFinal(toString.getModifiers());
+
+        }
+        catch (SecurityException e) {
+            throw new IllegalStateException("not allowed to reflect on toString method", e);
+        }
+        catch (NoSuchMethodException e) {
+            throw new Error("no public toString method found", e);
+        }
+    }
+
+}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/ObjectSpecIdTest_valueSemantics.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/Imposterisers.java
similarity index 57%
copy from core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/ObjectSpecIdTest_valueSemantics.java
copy to core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/Imposterisers.java
index e324b16..6a82dd3 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/ObjectSpecIdTest_valueSemantics.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/Imposterisers.java
@@ -16,23 +16,19 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.spec;
+package org.apache.isis.core.metamodel.unittestsupport.jmocking;
 
-import java.util.Arrays;
-import java.util.List;
+import org.jmock.api.Imposteriser;
 
-import org.apache.isis.core.unittestsupport.value.ValueTypeContractTestAbstract;
+public final class Imposterisers {
 
-public class ObjectSpecIdTest_valueSemantics extends ValueTypeContractTestAbstract<ObjectSpecId> {
+    private Imposterisers() {}
 
-    @Override
-    protected List<ObjectSpecId> getObjectsWithSameValue() {
-        return Arrays.asList(ObjectSpecId.of("CUS"), ObjectSpecId.of("CUS"), ObjectSpecId.of("CUS"));
-    }
-
-    @Override
-    protected List<ObjectSpecId> getObjectsWithDifferentValue() {
-        return Arrays.asList(ObjectSpecId.of("bUS"), ObjectSpecId.of("CUt"));
+    /**
+     * @return framework's default Imposteriser instance
+     */
+    public static Imposteriser getDefault() {
+        return ImposteriserUsingCodegenPlugin.INSTANCE;
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/InjectIntoJMockAction.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/InjectIntoJMockAction.java
new file mode 100644
index 0000000..dbe36de
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/InjectIntoJMockAction.java
@@ -0,0 +1,63 @@
+/*
+ *  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
+ *
+ *        http://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.isis.core.metamodel.unittestsupport.jmocking;
+
+import java.lang.reflect.Method;
+
+import org.hamcrest.Description;
+import org.jmock.api.Action;
+import org.jmock.api.Invocation;
+
+public final class InjectIntoJMockAction implements Action {
+    @Override
+    public void describeTo(final Description description) {
+        description.appendText("inject self");
+    }
+
+    // x.injectInto(y) ---> y.setXxx(x)
+    @Override
+    public Object invoke(final Invocation invocation) throws Throwable {
+        final Object injectable = invocation.getInvokedObject();
+        final Object toInjectInto = invocation.getParameter(0);
+        final Method[] methods = toInjectInto.getClass().getMethods();
+        for (final Method method : methods) {
+            if (!method.getName().startsWith("set")) {
+                continue;
+            }
+            if (method.getParameterTypes().length != 1) {
+                continue;
+            }
+            final Class<?> methodParameterType = method.getParameterTypes()[0];
+            if (methodParameterType.isAssignableFrom(injectable.getClass())) {
+                method.invoke(toInjectInto, injectable);
+                break;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Factory
+     */
+    public static Action injectInto() {
+        return new InjectIntoJMockAction();
+    }
+
+}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/IsisActions.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/IsisActions.java
new file mode 100644
index 0000000..4e47164
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/IsisActions.java
@@ -0,0 +1,60 @@
+/*
+ *  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
+ *
+ *        http://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.isis.core.metamodel.unittestsupport.jmocking;
+
+import org.hamcrest.Description;
+import org.jmock.api.Action;
+import org.jmock.api.Invocation;
+
+public final class IsisActions {
+
+    private IsisActions() {
+    }
+
+    public static Action injectInto() {
+        return InjectIntoJMockAction.injectInto();
+    }
+
+    @SafeVarargs
+    public static <T> Action returnEach(final T... values) {
+        return JMockActions.returnEach(values);
+    }
+
+    public static Action returnArgument(final int i) {
+        return JMockActions.returnArgument(i);
+    }
+
+    public static Action returnNewTransientInstance() {
+        return new Action(){
+
+            @Override
+            public void describeTo(Description description) {
+                description.appendText("new transient instance");
+            }
+
+            @Override
+            public Object invoke(Invocation invocation) throws Throwable {
+                Class<?> cls = (Class<?>) invocation.getParameter(0);
+                return cls.newInstance();
+            }
+        };
+    }
+
+
+}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/JMockActions.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/JMockActions.java
new file mode 100644
index 0000000..1247486
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/JMockActions.java
@@ -0,0 +1,86 @@
+/*
+ *  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
+ *
+ *        http://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.isis.core.metamodel.unittestsupport.jmocking;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.hamcrest.Description;
+import org.jmock.api.Action;
+import org.jmock.api.Invocation;
+
+public final class JMockActions {
+
+    private JMockActions() {
+    }
+
+    @SafeVarargs
+    public static <T> Action returnEach(final T... values) {
+        return new ReturnEachAction<T>(values);
+    }
+
+    public static Action returnArgument(final int i) {
+        return new ReturnArgumentJMockAction(i);
+    }
+
+    private static class ReturnEachAction<T> implements Action {
+
+        private final Collection<T> collection;
+        private final Iterator<T> iterator;
+
+        ReturnEachAction(Collection<T> collection) {
+            this.collection = collection;
+            this.iterator = collection.iterator();
+        }
+
+        @SafeVarargs
+        private ReturnEachAction(T... array) {
+            this(Arrays.asList(array));
+        }
+
+        @Override
+        public T invoke(Invocation invocation) throws Throwable {
+            return iterator.next();
+        }
+
+        @Override
+        public void describeTo(Description description) {
+            description.appendValueList("return iterator.next() over ", ", ", "", collection);
+        }
+    }
+
+    private static final class ReturnArgumentJMockAction implements Action {
+        private final int i;
+
+        private ReturnArgumentJMockAction(final int i) {
+            this.i = i;
+        }
+
+        @Override
+        public void describeTo(final Description description) {
+            description.appendText("parameter #" + i + " ");
+        }
+
+        @Override
+        public Object invoke(final Invocation invocation) throws Throwable {
+            return invocation.getParameter(i);
+        }
+    }
+}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/JUnitRuleMockery2.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/JUnitRuleMockery2.java
new file mode 100644
index 0000000..9f903e0
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/JUnitRuleMockery2.java
@@ -0,0 +1,321 @@
+/*
+ *  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
+ *
+ *        http://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.isis.core.metamodel.unittestsupport.jmocking;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.util.List;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import org.jmock.Expectations;
+import org.jmock.auto.Mock;
+import org.jmock.integration.junit4.JUnit4Mockery;
+import org.jmock.internal.AllDeclaredFields;
+import org.jmock.lib.concurrent.Synchroniser;
+import org.junit.rules.MethodRule;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.Statement;
+import org.picocontainer.MutablePicoContainer;
+import org.picocontainer.PicoBuilder;
+
+import static org.junit.Assert.fail;
+
+import org.apache.isis.core.commons.internal.base._Casts;
+import org.apache.isis.core.commons.internal.context._Context;
+import org.apache.isis.core.commons.internal.environment.IsisSystemEnvironment;
+
+import junit.framework.AssertionFailedError;
+
+
+/**
+ * Use as a <tt>@Rule</tt>, meaning that the <tt>@RunWith(JMock.class)</tt> can
+ * be ignored.
+ *
+ * <pre>
+ * public class MyTest {
+ *
+ *     &#064;Rule
+ *     public final Junit4Mockery2 context = Junit4Mockery2.createFor(Mode.INTERFACES);
+ *
+ * }
+ * </pre>
+ *
+ * <p>
+ * The class also adds some convenience methods, and uses a factory method to
+ * make it explicit whether the context can mock only interfaces or interfaces
+ * and classes.
+ *
+ * <p>
+ *     Used by domain apps only.
+ * </p>
+ */
+public class JUnitRuleMockery2 extends JUnit4Mockery implements MethodRule {
+
+    /**
+     * Factory method.
+     */
+    public static JUnitRuleMockery2 createFor(final Mode mode) {
+        
+        _Context.computeIfAbsent(IsisSystemEnvironment.class, IsisSystemEnvironment::new)
+        .setUnitTesting(true);
+        
+        final JUnitRuleMockery2 jUnitRuleMockery2 = new JUnitRuleMockery2();
+        if (mode == Mode.INTERFACES_AND_CLASSES) {
+            jUnitRuleMockery2.setImposteriser(Imposterisers.getDefault());
+        }
+        jUnitRuleMockery2.setThreadingPolicy(new Synchroniser());
+        return jUnitRuleMockery2;
+    }
+
+
+    /**
+     * Annotate the field that references the class under test;
+     * is automatically instantiated and autowired by this class,
+     * accessible to the test using {@link JUnitRuleMockery2#getClassUnderTest()}.
+     */
+    @Retention(RUNTIME)
+    @Target(FIELD)
+    public static @interface ClassUnderTest {}
+
+    /**
+     * Annotate fields annotated with {@link Mock}, to indicate that they should be set up
+     * with an {@link Expectations#ignoring(Object)} expectation.
+     */
+    @Retention(RUNTIME)
+    @Target(FIELD)
+    public static @interface Ignoring {}
+
+    /**
+     * Annotate fields annotated with {@link Mock}, to indicate that they should be set up
+     * with an {@link Expectations#allowing(Object)} expectation.
+     */
+    @Retention(RUNTIME)
+    @Target(FIELD)
+    public static @interface Allowing {}
+
+    /**
+     * Annotate fields annotated with {@link Mock}, to indicate that they should be set up
+     * with an {@link Expectations#never(Object)} expectation.
+     */
+    @Retention(RUNTIME)
+    @Target(FIELD)
+    public static @interface Never {}
+
+    /**
+     * Annotate fields annotated with {@link Mock}, to indicate that they should be set up
+     * with an {@link Expectations#one(Object)} expectation.
+     */
+    @Retention(RUNTIME)
+    @Target(FIELD)
+    public static @interface One {}
+
+
+    /**
+     * Annotate fields annotated with {@link Mock}, to indicate that they should be set up
+     * to check the specified {@link ExpectationsOn expectation}.
+     */
+    @Retention(RUNTIME)
+    @Target(FIELD)
+    public static @interface Checking {
+        Class<? extends ExpectationsOn> value() default ExpectationsOn.class;
+    }
+
+    public static enum Mode {
+        INTERFACES_ONLY, INTERFACES_AND_CLASSES;
+    }
+
+    private final MyMockomatic mockomatic = new MyMockomatic(this);
+    private final MutablePicoContainer container = new PicoBuilder().withConstructorInjection().withSetterInjection().build();
+    private Class<?> cutType;
+
+    private JUnitRuleMockery2() {
+    }
+
+    @Override
+    public Statement apply(final Statement base, final FrameworkMethod method, final Object target) {
+        return new Statement() {
+
+            @Override
+            public void evaluate() throws Throwable {
+                prepare(target);
+                base.evaluate();
+                assertIsSatisfied();
+            }
+
+            private void prepare(final Object target) throws IllegalAccessException {
+                final List<Field> allFields = AllDeclaredFields.in(target.getClass());
+                assertOnlyOneJMockContextIn(allFields);
+                List<Object> mocks = fillInAutoMocks(target, allFields);
+                Field cutField = locateClassUnderTestFieldIfAny(allFields);
+                if (cutField != null) {
+                    cutType = cutField.getType();
+                    for (Object mock : mocks) {
+                        container.addComponent(mock);
+                    }
+                    container.addComponent(cutType);
+
+                    final Object cut = container.getComponent(cutType);
+                    cutField.setAccessible(true);
+                    cutField.set(target, cut);
+
+                } else {
+                    cutType = null;
+                }
+
+            }
+
+            private void assertOnlyOneJMockContextIn(final List<Field> allFields) {
+                Field contextField = null;
+                for (final Field field : allFields) {
+                    if (JUnitRuleMockery2.class.isAssignableFrom(field.getType())) {
+                        if (null != contextField) {
+                            fail("Test class should only have one JUnitRuleMockery2 field, found " + contextField.getName() + " and " + field.getName());
+                        }
+                        contextField = field;
+                    }
+                }
+            }
+
+
+            protected Field locateClassUnderTestFieldIfAny(final List<Field> allFields) {
+                Field cutField = null;
+                for (final Field field : allFields) {
+                    if(field.getAnnotation(ClassUnderTest.class) != null) {
+                        if (null != cutField) {
+                            fail("Test class should only have one field annotated with @ClassUnderTest, found " + cutField.getName() + " and " + field.getName());
+                        }
+                        cutField = field;
+                    }
+                }
+                return cutField;
+            }
+
+            private List<Object> fillInAutoMocks(final Object target, final List<Field> allFields) {
+                return mockomatic.fillIn(target, allFields);
+            }
+        };
+    }
+
+
+    public <T> T getClassUnderTest() {
+        if(cutType == null) {
+            throw new IllegalStateException("No field annotated @ClassUnderTest was found");
+        }
+        return _Casts.uncheckedCast( container.getComponent(cutType) );
+    }
+
+
+    /**
+     * Ignoring any interaction with the mock; an allowing/ignoring mock will be
+     * returned in turn.
+     */
+    public <T> T ignoring(final T mock) {
+        checking(new Expectations() {
+            {
+                ignoring(mock);
+            }
+        });
+        return mock;
+    }
+
+    /**
+     * Allow any interaction with the mock; an allowing mock will be returned in
+     * turn.
+     */
+    public <T> T allowing(final T mock) {
+        checking(new Expectations() {
+            {
+                allowing(mock);
+            }
+        });
+        return mock;
+    }
+
+    /**
+     * Prohibit any interaction with the mock.
+     */
+    public <T> T never(final T mock) {
+        checking(new Expectations() {
+            {
+                never(mock);
+            }
+        });
+        return mock;
+    }
+
+    /**
+     * Ignore a set of mocks.
+     */
+    public void ignoring(Object... mocks) {
+        for (Object mock : mocks) {
+            ignoring(mock);
+        }
+    }
+
+
+    /**
+     * Require one interaction
+     * @return
+     */
+    public Object oneOf(final Object mock) {
+        checking(new Expectations() {
+            {
+                oneOf(mock);
+            }
+        });
+        return mock;
+    }
+
+    /**
+     * Require one interaction
+     * @return
+     * @deprecated use {@link #oneOf(Object)} instead
+     */
+    @Deprecated
+    public Object one(final Object mock) {
+        return oneOf(mock);
+    }
+
+    public static class ExpectationsOn<T> extends Expectations {
+        public ExpectationsOn(Object mock) {
+            this.mockObj = _Casts.uncheckedCast( mock );
+        }
+        private T mockObj;
+        public T mock() {
+            return mockObj;
+        }
+    }
+
+    public <T> T checking(T mock, Class<? extends ExpectationsOn<T>> expectationsClass) {
+        try {
+            Constructor<? extends ExpectationsOn<T>> constructor = expectationsClass.getConstructor(Object.class);
+            ExpectationsOn<T> expectations = constructor.newInstance(mock);
+            checking(expectations);
+            return mock;
+        } catch (Exception e) {
+            throw new AssertionFailedError("Unable to instantiate expectations class '" + expectationsClass.getName() + "'");
+        }
+    }
+
+
+}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/MyMockomatic.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/MyMockomatic.java
new file mode 100644
index 0000000..4422574
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/MyMockomatic.java
@@ -0,0 +1,110 @@
+/*
+ *  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
+ *
+ *        http://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.isis.core.metamodel.unittestsupport.jmocking;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jmock.Sequence;
+import org.jmock.States;
+import org.jmock.auto.Auto;
+import org.jmock.auto.Mock;
+
+class MyMockomatic {
+    private final JUnitRuleMockery2 context;
+
+    public MyMockomatic(final JUnitRuleMockery2 context) {
+        this.context = context;
+    }
+
+    public List<Object> fillIn(final Object object, final List<Field> knownFields) {
+        List<Object> mocks = new ArrayList<Object>();
+        for (final Field field : knownFields) {
+            autoMockIfAnnotated(object, field, mocks);
+            autoInstantiateIfAnnotated(object, field);
+        }
+        return mocks;
+    }
+
+    private void autoMockIfAnnotated(final Object object,
+            final Field field, List<Object> mocks) {
+        if (!field.isAnnotationPresent(Mock.class)) {
+            return;
+        }
+        final Object mock = context.mock(field.getType(), field.getName());
+        setAutoField(field, object, mock, "auto-mock field " + field.getName());
+        if(field.isAnnotationPresent(JUnitRuleMockery2.Ignoring.class)) {
+            context.ignoring(mock);
+        }
+        if(field.isAnnotationPresent(JUnitRuleMockery2.Allowing.class)) {
+            context.allowing(mock);
+        }
+        if(field.isAnnotationPresent(JUnitRuleMockery2.Never.class)) {
+            context.never(mock);
+        }
+        if(field.isAnnotationPresent(JUnitRuleMockery2.One.class)) {
+            context.oneOf(mock);
+        }
+        if(field.isAnnotationPresent(JUnitRuleMockery2.Checking.class)) {
+            checking(field, mock);
+        }
+        mocks.add(mock);
+    }
+
+    private <T> void checking(final Field field, final T mock) {
+        JUnitRuleMockery2.Checking checking = field.getAnnotation(JUnitRuleMockery2.Checking.class);
+        @SuppressWarnings("unchecked")
+        Class<? extends JUnitRuleMockery2.ExpectationsOn<T>> expectationsOnClass = (Class<? extends JUnitRuleMockery2.ExpectationsOn<T>>) checking.value();
+        context.checking(mock, expectationsOnClass);
+    }
+
+    private void autoInstantiateIfAnnotated(final Object object,
+            final Field field) {
+        if (!field.isAnnotationPresent(Auto.class)) {
+            return;
+        }
+        final Class<?> type = field.getType();
+        if (type == States.class) {
+            autoInstantiateStates(field, object);
+        } else if (type == Sequence.class) {
+            autoInstantiateSequence(field, object);
+        } else {
+            throw new IllegalStateException("cannot auto-instantiate field of type " + type.getName());
+        }
+    }
+
+    private void autoInstantiateStates(final Field field, final Object object) {
+        setAutoField(field, object, context.states(field.getName()), "auto-instantiate States field " + field.getName());
+    }
+
+    private void autoInstantiateSequence(final Field field, final Object object) {
+        setAutoField(field, object, context.sequence(field.getName()), "auto-instantiate Sequence field " + field.getName());
+    }
+
+    private void setAutoField(final Field field, final Object object, final Object value, final String description) {
+        try {
+            field.setAccessible(true);
+            field.set(object, value);
+        } catch (final IllegalAccessException e) {
+            throw new IllegalStateException("cannot " + description, e);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/ObjectSpecIdTest_valueSemantics.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/PostponedAction.java
similarity index 54%
copy from core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/ObjectSpecIdTest_valueSemantics.java
copy to core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/PostponedAction.java
index e324b16..cb43b6a 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/spec/ObjectSpecIdTest_valueSemantics.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/unittestsupport/jmocking/PostponedAction.java
@@ -16,23 +16,31 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.spec;
+package org.apache.isis.core.metamodel.unittestsupport.jmocking;
 
-import java.util.Arrays;
-import java.util.List;
+import java.util.function.Supplier;
 
-import org.apache.isis.core.unittestsupport.value.ValueTypeContractTestAbstract;
+import org.hamcrest.Description;
+import org.jmock.api.Action;
+import org.jmock.api.Invocation;
 
-public class ObjectSpecIdTest_valueSemantics extends ValueTypeContractTestAbstract<ObjectSpecId> {
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
 
-    @Override
-    protected List<ObjectSpecId> getObjectsWithSameValue() {
-        return Arrays.asList(ObjectSpecId.of("CUS"), ObjectSpecId.of("CUS"), ObjectSpecId.of("CUS"));
+@RequiredArgsConstructor(staticName = "returnValuePostponed")
+public class PostponedAction implements Action {
+    
+    @NonNull private Supplier<Object> resultSupplier;
+
+    public Object invoke(Invocation invocation) throws Throwable {
+        return resultSupplier.get();
     }
 
-    @Override
-    protected List<ObjectSpecId> getObjectsWithDifferentValue() {
-        return Arrays.asList(ObjectSpecId.of("bUS"), ObjectSpecId.of("CUt"));
+    public void describeTo(Description description) {
+        description.appendText("returns ");
+        description.appendValue(resultSupplier.get());
     }
+    
+    
 
 }