From e48025d0a75a12f01effefc4fdf1274507f51dbc Mon Sep 17 00:00:00 2001 From: Bhavik Kothari <20669150+bkkothari2255@users.noreply.github.com> Date: Sun, 1 Feb 2026 18:22:03 +0530 Subject: [PATCH] SLING-13088: [Sling Models] Migrate ModelAdapterFactory, Ordering, and OSGi tests to JUnit 5 --- pom.xml | 6 + .../models/impl/ModelAdapterFactoryTest.java | 80 +++++++------- ...Factory_ImplementationPickerOrderTest.java | 25 ++--- ...ModelAdapterFactory_InjectorOrderTest.java | 39 ++++--- .../impl/ModelPackageBundleListenerTest.java | 41 +++---- .../models/impl/MultipleInjectorTest.java | 41 +++---- .../sling/models/impl/OSGiInjectionTest.java | 103 +++++++++--------- .../models/impl/OptionalObjectsTest.java | 57 +++++----- .../models/impl/OptionalPrimitivesTest.java | 30 ++--- 9 files changed, 218 insertions(+), 204 deletions(-) diff --git a/pom.xml b/pom.xml index dc30e980..d588e6c7 100644 --- a/pom.xml +++ b/pom.xml @@ -198,6 +198,12 @@ 3.5.4 test + + org.apache.sling + org.apache.sling.testing.osgi-mock.junit5 + 3.5.4 + test + org.mockito mockito-core diff --git a/src/test/java/org/apache/sling/models/impl/ModelAdapterFactoryTest.java b/src/test/java/org/apache/sling/models/impl/ModelAdapterFactoryTest.java index ee895434..a38efbc8 100644 --- a/src/test/java/org/apache/sling/models/impl/ModelAdapterFactoryTest.java +++ b/src/test/java/org/apache/sling/models/impl/ModelAdapterFactoryTest.java @@ -34,32 +34,32 @@ import org.apache.sling.models.testutil.ModelAdapterFactoryUtil; import org.apache.sling.scripting.api.BindingsValuesProvidersByContext; import org.apache.sling.testing.mock.osgi.junit.OsgiContext; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.apache.sling.testing.mock.osgi.junit5.OsgiContextExtension; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThrows; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyMap; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; /** * */ -@RunWith(MockitoJUnitRunner.class) -public class ModelAdapterFactoryTest { +@ExtendWith({OsgiContextExtension.class, MockitoExtension.class}) +class ModelAdapterFactoryTest { - @Rule - public final OsgiContext context = new OsgiContext(); + final OsgiContext context = new OsgiContext(); @Mock private AdapterManager adapterManager; @@ -87,9 +87,9 @@ public class ModelAdapterFactoryTest { private ModelAdapterFactory factory; @SuppressWarnings("deprecation") - @Before - public void setUp() { - when(resourceResolver.getSearchPath()).thenReturn(new String[] {"/apps/", "/libs/"}); + @BeforeEach + void setUp() { + lenient().when(resourceResolver.getSearchPath()).thenReturn(new String[] {"/apps/", "/libs/"}); context.registerService(BindingsValuesProvidersByContext.class, bindingsValuesProvidersByContext); context.registerService(AdapterManager.class, adapterManager); @@ -97,10 +97,10 @@ public void setUp() { ModelAdapterFactoryUtil.addModelsForPackage(context.bundleContext(), JakartaModel1.class, JavaxModel2.class); - Mockito.when(resource.getResourceType()).thenReturn("nt:unstructured"); - Mockito.when(resource.getResourceResolver()).thenReturn(resourceResolver); - Mockito.when(jakartaRequest.getResource()).thenReturn(resource); - Mockito.when(javaxRequest.getResource()).thenReturn(resource); + lenient().when(resource.getResourceType()).thenReturn("nt:unstructured"); + lenient().when(resource.getResourceResolver()).thenReturn(resourceResolver); + lenient().when(jakartaRequest.getResource()).thenReturn(resource); + lenient().when(javaxRequest.getResource()).thenReturn(resource); } protected void registerModel(final Class adaptableType, final Class clazz) { @@ -114,7 +114,7 @@ protected void registerModel(final Class adaptableType, final Class clazz) */ @Deprecated(since = "2.0.0") @Test - public void testCreateModelFromWrappedRequestSlingHttpServletRequestResourceClassOfT() { + void testCreateModelFromWrappedRequestSlingHttpServletRequestResourceClassOfT() { assertNotNull(factory.createModelFromWrappedRequest(javaxRequest, resource, JavaxModel2.class)); } @@ -122,7 +122,7 @@ public void testCreateModelFromWrappedRequestSlingHttpServletRequestResourceClas * Test method for {@link org.apache.sling.models.impl.ModelAdapterFactory#createModelFromWrappedRequest(org.apache.sling.api.SlingJakartaHttpServletRequest, org.apache.sling.api.resource.Resource, java.lang.Class)}. */ @Test - public void testCreateModelFromWrappedRequestSlingJakartaHttpServletRequestResourceClassOfT() { + void testCreateModelFromWrappedRequestSlingJakartaHttpServletRequestResourceClassOfT() { assertNotNull(factory.createModelFromWrappedRequest(jakartaRequest, resource, JakartaModel1.class)); } @@ -132,7 +132,7 @@ public void testCreateModelFromWrappedRequestSlingJakartaHttpServletRequestResou */ @Deprecated(since = "2.0.0") @Test - public void testIsModelClassObjectClassOfQ() { + void testIsModelClassObjectClassOfQ() { assertTrue(factory.isModelClass(jakartaRequest, JakartaModel1.class)); assertTrue(factory.isModelClass(jakartaRequest, JavaxModel2.class)); assertFalse(factory.isModelClass(jakartaRequest, Object.class)); @@ -143,7 +143,7 @@ public void testIsModelClassObjectClassOfQ() { */ @SuppressWarnings("deprecation") @Test - public void testIsModelClassClassOfQ() { + void testIsModelClassClassOfQ() { assertTrue(factory.isModelClass(JakartaModel1.class)); assertTrue(factory.isModelClass(JavaxModel2.class)); assertFalse(factory.isModelClass(Object.class)); @@ -155,7 +155,7 @@ public void testIsModelClassClassOfQ() { */ @Deprecated(since = "2.0.0") @Test - public void testIsModelAvailableForRequestSlingHttpServletRequest() { + void testIsModelAvailableForRequestSlingHttpServletRequest() { assertFalse(factory.isModelAvailableForRequest(javaxRequest)); registerModel(org.apache.sling.api.SlingHttpServletRequest.class, JavaxModel2.class); @@ -167,7 +167,7 @@ public void testIsModelAvailableForRequestSlingHttpServletRequest() { * Test method for {@link org.apache.sling.models.impl.ModelAdapterFactory#isModelAvailableForRequest(org.apache.sling.api.SlingJakartaHttpServletRequest)}. */ @Test - public void testIsModelAvailableForRequestSlingJakartaHttpServletRequest() { + void testIsModelAvailableForRequestSlingJakartaHttpServletRequest() { assertFalse(factory.isModelAvailableForRequest(jakartaRequest)); registerModel(SlingJakartaHttpServletRequest.class, JakartaModel1.class); @@ -179,7 +179,7 @@ public void testIsModelAvailableForRequestSlingJakartaHttpServletRequest() { * Test method for {@link org.apache.sling.models.impl.ModelAdapterFactory#getModelFromResource(org.apache.sling.api.resource.Resource)}. */ @Test - public void testGetModelFromResource() { + void testGetModelFromResource() { assertThrows(ModelClassException.class, () -> factory.getModelFromResource(resource)); registerModel(Resource.class, JakartaModel1.class); @@ -195,7 +195,7 @@ public void testGetModelFromResource() { @SuppressWarnings("deprecation") @Deprecated(since = "2.0.0") @Test - public void testGetModelFromRequestSlingHttpServletRequest() { + void testGetModelFromRequestSlingHttpServletRequest() { assertThrows(ModelClassException.class, () -> factory.getModelFromRequest(javaxRequest)); registerModel(org.apache.sling.api.SlingHttpServletRequest.class, JavaxModel2.class); @@ -208,7 +208,7 @@ public void testGetModelFromRequestSlingHttpServletRequest() { * Test method for {@link org.apache.sling.models.impl.ModelAdapterFactory#getModelFromRequest(org.apache.sling.api.SlingJakartaHttpServletRequest)}. */ @Test - public void testGetModelFromRequestSlingJakartaHttpServletRequest() { + void testGetModelFromRequestSlingJakartaHttpServletRequest() { assertThrows(ModelClassException.class, () -> factory.getModelFromRequest(jakartaRequest)); registerModel(SlingJakartaHttpServletRequest.class, JakartaModel1.class); @@ -224,7 +224,7 @@ public void testGetModelFromRequestSlingJakartaHttpServletRequest() { @Deprecated(since = "2.0.0") @SuppressWarnings({"unchecked", "deprecation"}) @Test - public void testExportModelForRequestSlingHttpServletRequestStringClassOfTMapOfStringString() + void testExportModelForRequestSlingHttpServletRequestStringClassOfTMapOfStringString() throws ExportException, MissingExporterException { Map options = Map.of(); assertThrows( @@ -232,9 +232,9 @@ public void testExportModelForRequestSlingHttpServletRequestStringClassOfTMapOfS () -> factory.exportModelForRequest(javaxRequest, "exporter1", JavaxModel2.class, options)); ModelExporter mockExporter = context.registerService(ModelExporter.class, Mockito.mock(ModelExporter.class)); - Mockito.when(mockExporter.getName()).thenReturn("exporter1"); - Mockito.when(mockExporter.isSupported(JavaxModel2.class)).thenReturn(true); - Mockito.when(mockExporter.export(any(), any(Class.class), anyMap())).thenAnswer(invocation -> { + when(mockExporter.getName()).thenReturn("exporter1"); + when(mockExporter.isSupported(JavaxModel2.class)).thenReturn(true); + when(mockExporter.export(any(), any(Class.class), anyMap())).thenAnswer(invocation -> { return invocation.getArgument(0, JavaxModel2.class); }); @@ -250,7 +250,7 @@ public void testExportModelForRequestSlingHttpServletRequestStringClassOfTMapOfS */ @SuppressWarnings("unchecked") @Test - public void testExportModelForRequestSlingJakartaHttpServletRequestStringClassOfTMapOfStringString() + void testExportModelForRequestSlingJakartaHttpServletRequestStringClassOfTMapOfStringString() throws ExportException, MissingExporterException { Map options = Map.of(); assertThrows( @@ -258,9 +258,9 @@ public void testExportModelForRequestSlingJakartaHttpServletRequestStringClassOf () -> factory.exportModelForRequest(jakartaRequest, "exporter1", JakartaModel1.class, options)); ModelExporter mockExporter = context.registerService(ModelExporter.class, Mockito.mock(ModelExporter.class)); - Mockito.when(mockExporter.getName()).thenReturn("exporter1"); - Mockito.when(mockExporter.isSupported(JakartaModel1.class)).thenReturn(true); - Mockito.when(mockExporter.export(any(), any(Class.class), anyMap())).thenAnswer(invocation -> { + when(mockExporter.getName()).thenReturn("exporter1"); + when(mockExporter.isSupported(JakartaModel1.class)).thenReturn(true); + when(mockExporter.export(any(), any(Class.class), anyMap())).thenAnswer(invocation -> { return invocation.getArgument(0, JakartaModel1.class); }); @@ -277,7 +277,7 @@ public void testExportModelForRequestSlingJakartaHttpServletRequestStringClassOf */ @Deprecated(since = "2.0.0") @Test - public void testGetModelFromWrappedRequestSlingHttpServletRequestResourceClassOfT() { + void testGetModelFromWrappedRequestSlingHttpServletRequestResourceClassOfT() { JavaxModel2 modelFromWrappedRequest = factory.getModelFromWrappedRequest(javaxRequest, resource, JavaxModel2.class); assertNull(modelFromWrappedRequest); @@ -296,7 +296,7 @@ public void testGetModelFromWrappedRequestSlingHttpServletRequestResourceClassOf * Test method for {@link org.apache.sling.models.impl.ModelAdapterFactory#getModelFromWrappedRequest(org.apache.sling.api.SlingJakartaHttpServletRequest, org.apache.sling.api.resource.Resource, java.lang.Class)}. */ @Test - public void testGetModelFromWrappedRequestSlingJakartaHttpServletRequestResourceClassOfT() { + void testGetModelFromWrappedRequestSlingJakartaHttpServletRequestResourceClassOfT() { assertNotNull(factory.createModelFromWrappedRequest(jakartaRequest, resource, JakartaModel1.class)); JakartaModel1 target = new JakartaModel1(); diff --git a/src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_ImplementationPickerOrderTest.java b/src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_ImplementationPickerOrderTest.java index 3bdac2d3..991aca18 100644 --- a/src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_ImplementationPickerOrderTest.java +++ b/src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_ImplementationPickerOrderTest.java @@ -27,13 +27,13 @@ import org.apache.sling.models.testutil.ModelAdapterFactoryUtil; import org.apache.sling.scripting.api.BindingsValuesProvidersByContext; import org.apache.sling.testing.mock.osgi.junit.OsgiContext; +import org.apache.sling.testing.mock.osgi.junit5.OsgiContextExtension; import org.jetbrains.annotations.NotNull; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import static org.junit.Assert.assertEquals; import static org.osgi.framework.Constants.SERVICE_RANKING; @@ -42,11 +42,10 @@ * Tests in which order the implementation pickers are handled depending on service ranking. * For historic/backwards compatibility reasons, higher ranking value means lower priority (inverse to DS behavior). */ -@RunWith(MockitoJUnitRunner.class) -public class ModelAdapterFactory_ImplementationPickerOrderTest { +@ExtendWith({OsgiContextExtension.class, MockitoExtension.class}) +class ModelAdapterFactory_ImplementationPickerOrderTest { - @Rule - public final OsgiContext context = new OsgiContext(); + final OsgiContext context = new OsgiContext(); @Mock private AdapterManager adapterManager; @@ -59,8 +58,8 @@ public class ModelAdapterFactory_ImplementationPickerOrderTest { private ModelAdapterFactory factory; - @Before - public void setUp() { + @BeforeEach + void setUp() { context.registerService(BindingsValuesProvidersByContext.class, bindingsValuesProvidersByContext); context.registerService(AdapterManager.class, adapterManager); factory = context.registerInjectActivateService(ModelAdapterFactory.class); @@ -69,7 +68,7 @@ public void setUp() { } @Test - public void testFirstImplementationPicker() { + void testFirstImplementationPicker() { context.registerService( ImplementationPicker.class, new FirstImplementationPicker(), SERVICE_RANKING, Integer.MAX_VALUE); @@ -78,7 +77,7 @@ public void testFirstImplementationPicker() { } @Test - public void testMultipleImplementationPickers() { + void testMultipleImplementationPickers() { // LastImplementationPicker has higher priority context.registerService( ImplementationPicker.class, new FirstImplementationPicker(), SERVICE_RANKING, Integer.MAX_VALUE); diff --git a/src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_InjectorOrderTest.java b/src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_InjectorOrderTest.java index 6e3321ab..5494befc 100644 --- a/src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_InjectorOrderTest.java +++ b/src/test/java/org/apache/sling/models/impl/ModelAdapterFactory_InjectorOrderTest.java @@ -33,27 +33,26 @@ import org.apache.sling.models.spi.Injector; import org.apache.sling.models.testutil.ModelAdapterFactoryUtil; import org.apache.sling.scripting.api.BindingsValuesProvidersByContext; -import org.apache.sling.testing.mock.osgi.junit.OsgiContext; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.apache.sling.testing.mock.osgi.junit5.OsgiContext; +import org.apache.sling.testing.mock.osgi.junit5.OsgiContextExtension; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.when; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.lenient; import static org.osgi.framework.Constants.SERVICE_RANKING; /** * Tests in which order the injectors are handled depending on service ranking. * For historic/backwards compatibility reasons, higher ranking value means lower priority (inverse to DS behavior). */ -@RunWith(MockitoJUnitRunner.class) -public class ModelAdapterFactory_InjectorOrderTest { +@ExtendWith({OsgiContextExtension.class, MockitoExtension.class}) +class ModelAdapterFactory_InjectorOrderTest { - @Rule - public final OsgiContext context = new OsgiContext(); + final OsgiContext context = new OsgiContext(); @Mock private AdapterManager adapterManager; @@ -70,21 +69,21 @@ public class ModelAdapterFactory_InjectorOrderTest { private ModelAdapterFactory factory; @SuppressWarnings("null") - @Before - public void setUp() { + @BeforeEach + void setUp() { context.registerService(BindingsValuesProvidersByContext.class, bindingsValuesProvidersByContext); context.registerService(AdapterManager.class, adapterManager); factory = context.registerInjectActivateService(ModelAdapterFactory.class); ModelAdapterFactoryUtil.addModelsForPackage(context.bundleContext(), TestModel.class); - when(request.getResource()).thenReturn(resource); - when(resource.adaptTo(ValueMap.class)).thenReturn(new ValueMapDecorator(Map.of("prop1", 1))); - when(request.getAttribute("prop1")).thenReturn(2); + lenient().when(request.getResource()).thenReturn(resource); + lenient().when(resource.adaptTo(ValueMap.class)).thenReturn(new ValueMapDecorator(Map.of("prop1", 1))); + lenient().when(request.getAttribute("prop1")).thenReturn(2); } @Test - public void testSingleInjector_ValueMap() { + void testSingleInjector_ValueMap() { context.registerService(Injector.class, new ValueMapInjector(), SERVICE_RANKING, 2000); TestModel model = factory.createModel(request, TestModel.class); @@ -92,7 +91,7 @@ public void testSingleInjector_ValueMap() { } @Test - public void testSingleInjector_RequestAttribute() { + void testSingleInjector_RequestAttribute() { context.registerService(Injector.class, new RequestAttributeInjector(), SERVICE_RANKING, 4000); TestModel model = factory.createModel(request, TestModel.class); @@ -100,7 +99,7 @@ public void testSingleInjector_RequestAttribute() { } @Test - public void testMultipleInjectors() { + void testMultipleInjectors() { // ValueMapInjector has higher priority context.registerService(Injector.class, new RequestAttributeInjector(), SERVICE_RANKING, 4000); context.registerService(Injector.class, new ValueMapInjector(), SERVICE_RANKING, 2000); diff --git a/src/test/java/org/apache/sling/models/impl/ModelPackageBundleListenerTest.java b/src/test/java/org/apache/sling/models/impl/ModelPackageBundleListenerTest.java index 3f340fca..56449a1f 100644 --- a/src/test/java/org/apache/sling/models/impl/ModelPackageBundleListenerTest.java +++ b/src/test/java/org/apache/sling/models/impl/ModelPackageBundleListenerTest.java @@ -26,21 +26,24 @@ import org.apache.sling.models.testmodels.classes.ChildModel; import org.apache.sling.models.testmodels.classes.SimpleModelWithInvalidSecondAnnotation; import org.apache.sling.models.testmodels.classes.annotations.Hidden; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.stubbing.Answer; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleEvent; import org.springframework.core.OverridingClassLoader; -@RunWith(MockitoJUnitRunner.class) -public class ModelPackageBundleListenerTest { +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class ModelPackageBundleListenerTest { @Mock private BundleContext mockBundleContext; @@ -79,25 +82,25 @@ protected Class loadClassForOverriding(String name) throws ClassNotFoundExcep } @Test - public void testAddingBundleWithResolvableModelAnnotation() throws ClassNotFoundException { - Assert.assertFalse( - "Model should not yet have been registered but was", - adapterImplementations.isModelClass(ChildModel.class)); + void testAddingBundleWithResolvableModelAnnotation() throws ClassNotFoundException { + assertFalse( + adapterImplementations.isModelClass(ChildModel.class), + "Model should not yet have been registered but was"); ModelPackageBundleListener listener = createListenerForBundleWithClass(ChildModel.class); listener.addingBundle(mockBundle, new BundleEvent(BundleEvent.STARTED, mockBundle)); - Assert.assertTrue( - "Model should have been registered but was not", adapterImplementations.isModelClass(ChildModel.class)); + assertTrue( + adapterImplementations.isModelClass(ChildModel.class), "Model should have been registered but was not"); } @Test - public void testAddingBundleWithNonResolvableNonModelAnnotation() throws ClassNotFoundException { + void testAddingBundleWithNonResolvableNonModelAnnotation() throws ClassNotFoundException { ClassLoader classLoader = new HideClassesClassLoader(this.getClass().getClassLoader(), Hidden.class.getName()); ModelPackageBundleListener listener = createListenerForBundleWithClass(classLoader, SimpleModelWithInvalidSecondAnnotation.class.getName()); listener.addingBundle(mockBundle, new BundleEvent(BundleEvent.STARTED, mockBundle)); - Assert.assertFalse( - "Model should not yet have been registered but was", - adapterImplementations.isModelClass(SimpleModelWithInvalidSecondAnnotation.class)); + assertFalse( + adapterImplementations.isModelClass(SimpleModelWithInvalidSecondAnnotation.class), + "Model should not yet have been registered but was"); } private ModelPackageBundleListener createListenerForBundleWithClass(Class modelClass) @@ -109,8 +112,8 @@ private ModelPackageBundleListener createListenerForBundleWithClass(ClassLoader throws ClassNotFoundException { Dictionary headers = new Hashtable<>(); headers.put(ModelPackageBundleListener.CLASSES_HEADER, className); - Mockito.when(mockBundle.getHeaders()).thenReturn(headers); - Mockito.when(mockBundle.loadClass(Mockito.anyString())).thenAnswer(new Answer>() { + when(mockBundle.getHeaders()).thenReturn(headers); + when(mockBundle.loadClass(anyString())).thenAnswer(new Answer>() { @Override public Class answer(InvocationOnMock invocation) throws Throwable { Object argument = invocation.getArguments()[0]; diff --git a/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java b/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java index adff2b6a..8dac5fc8 100644 --- a/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java +++ b/src/test/java/org/apache/sling/models/impl/MultipleInjectorTest.java @@ -29,21 +29,21 @@ import org.apache.sling.models.factory.ModelClassException; import org.apache.sling.models.impl.injectors.BindingsInjector; import org.apache.sling.models.impl.injectors.RequestAttributeInjector; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Spy; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.lenient; -import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) -public class MultipleInjectorTest { +@ExtendWith(MockitoExtension.class) +class MultipleInjectorTest { @Spy private BindingsInjector bindingsInjector; @@ -58,8 +58,8 @@ public class MultipleInjectorTest { private SlingBindings bindings; - @Before - public void setup() { + @BeforeEach + void setup() { bindings = new SlingBindings(); factory = AdapterFactoryTest.createModelAdapterFactory(); @@ -67,13 +67,13 @@ public void setup() { factory.injectors = Arrays.asList(bindingsInjector, attributesInjector); factory.bindStaticInjectAnnotationProcessorFactory(bindingsInjector, new ServicePropertiesMap(1, 1)); - when(request.getAttribute(SlingBindings.class.getName())).thenReturn(bindings); + lenient().when(request.getAttribute(SlingBindings.class.getName())).thenReturn(bindings); factory.adapterImplementations.addClassesAsAdapterAndImplementation( ForTwoInjectorsWithSource.class, ForTwoInjectors.class, ForTwoInjectorsWithInvalidSource.class); } @Test - public void testInjectorOrder() { + void testInjectorOrder() { String bindingsValue = "bindings value"; bindings.put("firstAttribute", bindingsValue); @@ -87,12 +87,12 @@ public void testInjectorOrder() { } @Test - public void testInjectorOrderWithSource() { + void testInjectorOrderWithSource() { String bindingsValue = "bindings value"; bindings.put("firstAttribute", bindingsValue); String attributeValue = "attribute value"; - when(request.getAttribute("firstAttribute")).thenReturn(attributeValue); + lenient().when(request.getAttribute("firstAttribute")).thenReturn(attributeValue); ForTwoInjectorsWithSource obj = factory.getAdapter(request, ForTwoInjectorsWithSource.class); @@ -101,14 +101,15 @@ public void testInjectorOrderWithSource() { } @Test - public void testInjectorWithInvalidSource() { + void testInjectorWithInvalidSource() { ForTwoInjectorsWithInvalidSource obj = factory.getAdapter(request, ForTwoInjectorsWithInvalidSource.class); assertNull(obj); } - @Test(expected = ModelClassException.class) - public void testInjectorWithInvalidSourceWithException() { - factory.createModel(request, ForTwoInjectorsWithInvalidSource.class); + @Test + void testInjectorWithInvalidSourceWithException() { + assertThrows( + ModelClassException.class, () -> factory.createModel(request, ForTwoInjectorsWithInvalidSource.class)); } @Model(adaptables = SlingJakartaHttpServletRequest.class) diff --git a/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java b/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java index a0fc22fc..4f2b62e5 100644 --- a/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java +++ b/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java @@ -36,29 +36,30 @@ import org.apache.sling.models.testmodels.classes.SimpleOSGiModel; import org.apache.sling.models.testmodels.interfaces.ServiceInterface; import org.hamcrest.Matchers; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleListener; import org.osgi.framework.ServiceReference; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) -public class OSGiInjectionTest { +@ExtendWith(MockitoExtension.class) +class OSGiInjectionTest { private ModelAdapterFactory factory; @Mock @@ -69,8 +70,8 @@ public class OSGiInjectionTest { private SlingBindings bindings = new SlingBindings(); - @Before - public void setup() { + @BeforeEach + void setup() { factory = AdapterFactoryTest.createModelAdapterFactory(bundleContext); OSGiServiceInjector injectorFactory = new OSGiServiceInjector(); @@ -92,13 +93,13 @@ public void setup() { } @Test - @SuppressWarnings({"unchecked", "null"}) - public void testSimpleOSGiModelField() throws Exception { - ServiceReference ref = mock(ServiceReference.class); + @SuppressWarnings({"null"}) + void testSimpleOSGiModelField() throws Exception { + ServiceReference ref = mock(ServiceReference.class); ServiceInterface service = mock(ServiceInterface.class); when(bundleContext.getServiceReferences(ServiceInterface.class.getName(), null)) .thenReturn(new ServiceReference[] {ref}); - when(bundleContext.getService(ref)).thenReturn(service); + doReturn(service).when(bundleContext).getService(ref); Resource res = mock(Resource.class); @@ -111,14 +112,14 @@ public void testSimpleOSGiModelField() throws Exception { } @Test - @SuppressWarnings({"unchecked", "null"}) - public void testListOSGiModelField() throws Exception { - ServiceReference ref1 = mock(ServiceReference.class); + @SuppressWarnings({"null"}) + void testListOSGiModelField() throws Exception { + ServiceReference ref1 = mock(ServiceReference.class); ServiceInterface service1 = mock(ServiceInterface.class); - when(bundleContext.getService(ref1)).thenReturn(service1); - ServiceReference ref2 = mock(ServiceReference.class); + doReturn(service1).when(bundleContext).getService(ref1); + ServiceReference ref2 = mock(ServiceReference.class); ServiceInterface service2 = mock(ServiceInterface.class); - when(bundleContext.getService(ref2)).thenReturn(service2); + doReturn(service2).when(bundleContext).getService(ref2); when(bundleContext.getServiceReferences(ServiceInterface.class.getName(), null)) .thenReturn(new ServiceReference[] {ref1, ref2}); @@ -136,14 +137,14 @@ public void testListOSGiModelField() throws Exception { } @Test - @SuppressWarnings({"unchecked", "null"}) - public void testArrayOSGiModelField() throws Exception { - ServiceReference ref1 = mock(ServiceReference.class); + @SuppressWarnings({"null"}) + void testArrayOSGiModelField() throws Exception { + ServiceReference ref1 = mock(ServiceReference.class); ServiceInterface service1 = mock(ServiceInterface.class); - when(bundleContext.getService(ref1)).thenReturn(service1); - ServiceReference ref2 = mock(ServiceReference.class); + doReturn(service1).when(bundleContext).getService(ref1); + ServiceReference ref2 = mock(ServiceReference.class); ServiceInterface service2 = mock(ServiceInterface.class); - when(bundleContext.getService(ref2)).thenReturn(service2); + doReturn(service2).when(bundleContext).getService(ref2); when(bundleContext.getServiceReferences(ServiceInterface.class.getName(), null)) .thenReturn(new ServiceReference[] {ref1, ref2}); @@ -162,7 +163,7 @@ public void testArrayOSGiModelField() throws Exception { @Test @SuppressWarnings("null") - public void testOptionalArrayOSGiModelField() throws Exception { + void testOptionalArrayOSGiModelField() { Resource res = mock(Resource.class); @@ -175,7 +176,7 @@ public void testOptionalArrayOSGiModelField() throws Exception { @Test @SuppressWarnings("null") - public void testOptionalListOSGiModelField() throws Exception { + void testOptionalListOSGiModelField() { Resource res = mock(Resource.class); OptionalListOSGiModel model = factory.getAdapter(res, OptionalListOSGiModel.class); @@ -186,14 +187,14 @@ public void testOptionalListOSGiModelField() throws Exception { } @Test - @SuppressWarnings({"unchecked", "null"}) - public void testCollectionOSGiModelField() throws Exception { - ServiceReference ref1 = mock(ServiceReference.class); + @SuppressWarnings({"null"}) + void testCollectionOSGiModelField() throws Exception { + ServiceReference ref1 = mock(ServiceReference.class); ServiceInterface service1 = mock(ServiceInterface.class); - when(bundleContext.getService(ref1)).thenReturn(service1); - ServiceReference ref2 = mock(ServiceReference.class); + doReturn(service1).when(bundleContext).getService(ref1); + ServiceReference ref2 = mock(ServiceReference.class); ServiceInterface service2 = mock(ServiceInterface.class); - when(bundleContext.getService(ref2)).thenReturn(service2); + doReturn(service2).when(bundleContext).getService(ref2); when(bundleContext.getServiceReferences(ServiceInterface.class.getName(), null)) .thenReturn(new ServiceReference[] {ref1, ref2}); @@ -211,14 +212,14 @@ public void testCollectionOSGiModelField() throws Exception { } @Test - @SuppressWarnings({"unused", "unchecked", "null"}) - public void testSetOSGiModelField() throws Exception { - ServiceReference ref1 = mock(ServiceReference.class); + @SuppressWarnings({"unused", "null"}) + void testSetOSGiModelField() throws Exception { + ServiceReference ref1 = mock(ServiceReference.class); ServiceInterface service1 = mock(ServiceInterface.class); - lenient().when(bundleContext.getService(ref1)).thenReturn(service1); - ServiceReference ref2 = mock(ServiceReference.class); + lenient().doReturn(service1).when(bundleContext).getService(ref1); + ServiceReference ref2 = mock(ServiceReference.class); ServiceInterface service2 = mock(ServiceInterface.class); - lenient().when(bundleContext.getService(ref2)).thenReturn(service2); + lenient().doReturn(service2).when(bundleContext).getService(ref2); lenient() .when(bundleContext.getServiceReferences(ServiceInterface.class.getName(), null)) @@ -238,13 +239,13 @@ public void testSetOSGiModelField() throws Exception { } @Test - @SuppressWarnings({"unchecked", "null"}) - public void testSimpleOSGiModelConstructor() throws Exception { - ServiceReference ref = mock(ServiceReference.class); + @SuppressWarnings({"null"}) + void testSimpleOSGiModelConstructor() throws Exception { + ServiceReference ref = mock(ServiceReference.class); ServiceInterface service = mock(ServiceInterface.class); when(bundleContext.getServiceReferences(ServiceInterface.class.getName(), null)) .thenReturn(new ServiceReference[] {ref}); - when(bundleContext.getService(ref)).thenReturn(service); + doReturn(service).when(bundleContext).getService(ref); Resource res = mock(Resource.class); @@ -258,14 +259,14 @@ public void testSimpleOSGiModelConstructor() throws Exception { } @Test - @SuppressWarnings({"unchecked", "null"}) - public void testListOSGiModelConstructor() throws Exception { - ServiceReference ref1 = mock(ServiceReference.class); + @SuppressWarnings({"null"}) + void testListOSGiModelConstructor() throws Exception { + ServiceReference ref1 = mock(ServiceReference.class); ServiceInterface service1 = mock(ServiceInterface.class); - when(bundleContext.getService(ref1)).thenReturn(service1); - ServiceReference ref2 = mock(ServiceReference.class); + doReturn(service1).when(bundleContext).getService(ref1); + ServiceReference ref2 = mock(ServiceReference.class); ServiceInterface service2 = mock(ServiceInterface.class); - when(bundleContext.getService(ref2)).thenReturn(service2); + doReturn(service2).when(bundleContext).getService(ref2); when(bundleContext.getServiceReferences(ServiceInterface.class.getName(), null)) .thenReturn(new ServiceReference[] {ref1, ref2}); diff --git a/src/test/java/org/apache/sling/models/impl/OptionalObjectsTest.java b/src/test/java/org/apache/sling/models/impl/OptionalObjectsTest.java index 541315df..678a2c4a 100644 --- a/src/test/java/org/apache/sling/models/impl/OptionalObjectsTest.java +++ b/src/test/java/org/apache/sling/models/impl/OptionalObjectsTest.java @@ -31,24 +31,26 @@ import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessorFactory; import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessorFactory2; import org.apache.sling.models.testmodels.classes.OptionalObjectsModel; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import org.slf4j.Logger; -import static org.junit.Assert.*; -import static org.mockito.ArgumentMatchers.eq; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) -public class OptionalObjectsTest { +@ExtendWith(MockitoExtension.class) +class OptionalObjectsTest { private ModelAdapterFactory factory; @@ -63,8 +65,8 @@ public class OptionalObjectsTest { @Mock private Logger log; - @Before - public void setup() { + @BeforeEach + void setup() { factory = AdapterFactoryTest.createModelAdapterFactory(); osgiInjector = new OSGiServiceInjector(); @@ -89,13 +91,13 @@ public void setup() { SlingBindings bindings = new SlingBindings(); bindings.setLog(log); - Mockito.when(request.getAttribute(SlingBindings.class.getName())).thenReturn(bindings); + lenient().when(request.getAttribute(SlingBindings.class.getName())).thenReturn(bindings); factory.adapterImplementations.addClassesAsAdapterAndImplementation(OptionalObjectsModel.class); } @Test - public void testFieldInjectionClass() { + void testFieldInjectionClass() { Map map = new HashMap<>(); map.put("optionalString", "foo bar baz"); map.put("optionalByte", Byte.valueOf("1")); @@ -147,7 +149,7 @@ public void testFieldInjectionClass() { } @Test - public void testFieldInjectionListsAndArrays() { + void testFieldInjectionListsAndArrays() { Map map = new HashMap<>(); map.put("intList", new Integer[] {1, 2, 9, 8}); @@ -178,11 +180,11 @@ public void testFieldInjectionListsAndArrays() { } @Test - public void testFieldInjectionsChildResource() throws Exception { + void testFieldInjectionsChildResource() { Resource res = mock(Resource.class); Resource child = mock(Resource.class); - when(child.getName()).thenReturn("child"); - when(res.getChild(eq("child"))).thenReturn(child); + lenient().when(child.getName()).thenReturn("child"); + lenient().when(res.getChild("child")).thenReturn(child); OptionalObjectsModel model = factory.getAdapter(res, OptionalObjectsModel.class); assertNotNull(model); @@ -192,7 +194,7 @@ public void testFieldInjectionsChildResource() throws Exception { } @Test - public void testFieldInjectionsScriptVariable() throws Exception { + void testFieldInjectionsScriptVariable() { SlingBindings bindings = new SlingBindings(); SlingScriptHelper helper = mock(SlingScriptHelper.class); bindings.setSling(helper); @@ -205,21 +207,24 @@ public void testFieldInjectionsScriptVariable() throws Exception { } @Test - public void testFieldInjectionsOSGiService() throws InvalidSyntaxException { - ServiceReference ref = mock(ServiceReference.class); - Logger log = mock(Logger.class); - when(bundleContext.getServiceReferences(Logger.class.getName(), null)).thenReturn(new ServiceReference[] {ref}); - when(bundleContext.getService(ref)).thenReturn(log); + void testFieldInjectionsOSGiService() throws InvalidSyntaxException { + ServiceReference ref = mock(ServiceReference.class); + Logger logger = mock(Logger.class); + lenient() + .when(bundleContext.getServiceReferences(Logger.class.getName(), null)) + .thenReturn(new ServiceReference[] {ref}); + + doReturn(logger).when(bundleContext).getService(ref); OptionalObjectsModel model = factory.getAdapter(request, OptionalObjectsModel.class); assertNotNull(model); - assertEquals(log, model.getLog().get()); + assertEquals(logger, model.getLog().get()); } @Test - public void testFieldInjectionsRequestAttribute() throws InvalidSyntaxException { + void testFieldInjectionsRequestAttribute() { Object attribute = new Object(); - when(request.getAttribute("attribute")).thenReturn(attribute); + lenient().when(request.getAttribute("attribute")).thenReturn(attribute); OptionalObjectsModel model = factory.getAdapter(request, OptionalObjectsModel.class); assertNotNull(model); diff --git a/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java b/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java index 32bdfd60..ca8ae091 100644 --- a/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java +++ b/src/test/java/org/apache/sling/models/impl/OptionalPrimitivesTest.java @@ -24,14 +24,14 @@ import org.apache.sling.api.resource.ValueMap; import org.apache.sling.models.impl.injectors.ChildResourceInjector; import org.apache.sling.models.impl.injectors.ValueMapInjector; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -39,13 +39,13 @@ /** * Validates that @Optional annotations works with primitive values which do not support null */ -@RunWith(MockitoJUnitRunner.class) -public class OptionalPrimitivesTest { +@ExtendWith(MockitoExtension.class) +class OptionalPrimitivesTest { private ModelAdapterFactory factory; - @Before - public void setup() { + @BeforeEach + void setup() { factory = AdapterFactoryTest.createModelAdapterFactory(); factory.injectors = Arrays.asList(new ChildResourceInjector(), new ValueMapInjector()); factory.adapterImplementations.addClassesAsAdapterAndImplementation( @@ -55,7 +55,7 @@ public void setup() { } @Test - public void testFieldInjectionClass() { + void testFieldInjectionClass() { ValueMap vm = ValueMap.EMPTY; Resource res = mock(Resource.class); @@ -87,7 +87,7 @@ public void testFieldInjectionClass() { } @Test - public void testConstructorInjection() { + void testConstructorInjection() { ValueMap vm = ValueMap.EMPTY; Resource res = mock(Resource.class); @@ -121,7 +121,7 @@ public void testConstructorInjection() { } @Test - public void testFieldInjectionInterface() { + void testFieldInjectionInterface() { ValueMap vm = ValueMap.EMPTY; Resource res = mock(Resource.class);