Author: rombert
Date: Fri Jun 19 14:31:30 2015
New Revision: 1686426

URL: http://svn.apache.org/r1686426
Log:
SLING-4813 - Support CGLIB enhanced classes for Mockito based service mocks

Submitted By: Krystian Panek

Closes #97

Modified:
    
sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
    
sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilTest.java
    
sling/trunk/testing/mocks/osgi-mock/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.xml

Modified: 
sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java?rev=1686426&r1=1686425&r2=1686426&view=diff
==============================================================================
--- 
sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
 (original)
+++ 
sling/trunk/testing/mocks/osgi-mock/src/main/java/org/apache/sling/testing/mock/osgi/OsgiMetadataUtil.java
 Fri Jun 19 14:31:30 2015
@@ -204,7 +204,8 @@ final class OsgiMetadataUtil {
      * @return XPath query fragment to find matching XML node in SCR metadata
      */
     private static String getComponentXPathQuery(Class clazz) {
-        return "//*[implementation/@class='" + clazz.getName() + "' or 
@name='" + clazz.getName() + "']";
+        String className = StringUtils.substringBefore(clazz.getName(), 
"$$Enhancer");
+        return "//*[implementation/@class='" + className + "' or @name='" + 
className + "']";
     }
 
     private static boolean matchesService(Class clazz, Document metadata) {

Modified: 
sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilTest.java?rev=1686426&r1=1686425&r2=1686426&view=diff
==============================================================================
--- 
sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilTest.java
 (original)
+++ 
sling/trunk/testing/mocks/osgi-mock/src/test/java/org/apache/sling/testing/mock/osgi/OsgiServiceUtilTest.java
 Fri Jun 19 14:31:30 2015
@@ -41,6 +41,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Service;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.Mockito;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -88,7 +89,7 @@ public class OsgiServiceUtilTest {
         List<Map<String, Object>> reference3Configs = 
service3.getReference3Configs();
         assertEquals(1, reference3Configs.size());
         assertEquals(200, 
reference3Configs.get(0).get(Constants.SERVICE_RANKING));
-        
+
         assertTrue(MockOsgi.deactivate(service3));
         assertNull(service3.getComponentContext());
     }
@@ -96,13 +97,13 @@ public class OsgiServiceUtilTest {
     @Test
     public void testService3_Config() {
         BundleContext bundleContext = MockOsgi.newBundleContext();
-        
+
         Map<String,Object> initialProperites = ImmutableMap.<String, 
Object>of("prop1", "value1");
 
         Service3 service3 = new Service3();
         MockOsgi.activate(service3, bundleContext, initialProperites);
         assertEquals(initialProperites.get("prop1"), 
service3.getConfig().get("prop1"));
-        
+
         Map<String,Object> newProperties = ImmutableMap.<String, 
Object>of("prop2", "value2");
         MockOsgi.modified(service3, bundleContext, newProperties);
         assertEquals(newProperties.get("prop2"), 
service3.getConfig().get("prop2"));
@@ -112,7 +113,7 @@ public class OsgiServiceUtilTest {
         MockOsgi.modified(service3, bundleContext, newPropertiesDictonary);
         assertEquals(newProperties.get("prop3"), 
service3.getConfig().get("prop3"));
     }
-    
+
     @Test
     public void testService4() {
         Service4 service4 = new Service4();
@@ -127,22 +128,22 @@ public class OsgiServiceUtilTest {
     public void testInjectServicesNoMetadata() {
         MockOsgi.injectServices(new Object(), MockOsgi.newBundleContext());
     }
-    
+
     @Test(expected=NoScrMetadataException.class)
     public void testActivateNoMetadata() {
         MockOsgi.activate(new Object());
     }
-    
+
     @Test(expected=NoScrMetadataException.class)
     public void testDeactivateNoMetadata() {
         MockOsgi.deactivate(new Object());
     }
-    
+
     @Test(expected=NoScrMetadataException.class)
     public void testModifiedNoMetadata() {
         MockOsgi.modified(new Object(), MockOsgi.newBundleContext(), 
ImmutableMap.<String,Object>of());
     }
-    
+
     public interface ServiceInterface1 {
         // no methods
     }
@@ -206,7 +207,7 @@ public class OsgiServiceUtilTest {
         private void deactivate(ComponentContext ctx) {
             this.componentContext = null;
         }
-        
+
         @Modified
         private void modified(Map<String,Object> newConfig) {
             this.config = newConfig;
@@ -239,7 +240,7 @@ public class OsgiServiceUtilTest {
         public ComponentContext getComponentContext() {
             return this.componentContext;
         }
-        
+
         public Map<String, Object> getConfig() {
             return config;
         }
@@ -300,4 +301,34 @@ public class OsgiServiceUtilTest {
 
     }
 
+    @Component
+    @Service({ ServiceInterface5.class })
+    public static class Service5 implements ServiceInterface5 {
+
+        @Override
+        public boolean doRemoteThing() {
+            return false;
+        }
+    }
+
+    public interface ServiceInterface5 {
+
+        boolean doRemoteThing();
+
+    }
+
+    @Test
+    public void testMockedService() {
+        Service5 service5 = Mockito.spy(new Service5());
+        Mockito.doReturn(true).when(service5).doRemoteThing();
+
+        MockOsgi.injectServices(service5, bundleContext);
+        MockOsgi.activate(service5, bundleContext, (Dictionary<String, 
Object>) null);
+        bundleContext.registerService(ServiceInterface5.class.getName(), 
service5, null);
+
+        assertSame(service5, bundleContext.getService(
+                
bundleContext.getServiceReference(ServiceInterface5.class.getName())));
+        assertEquals(true, service5.doRemoteThing());
+    }
+
 }

Modified: 
sling/trunk/testing/mocks/osgi-mock/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/testing/mocks/osgi-mock/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.xml?rev=1686426&r1=1686425&r2=1686426&view=diff
==============================================================================
--- 
sling/trunk/testing/mocks/osgi-mock/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.xml
 (original)
+++ 
sling/trunk/testing/mocks/osgi-mock/src/test/resources/OSGI-INF/org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest.xml
 Fri Jun 19 14:31:30 2015
@@ -48,4 +48,11 @@
     <property name="service.pid" 
value="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$Service4"/>
     <reference name="customName" 
interface="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$ServiceInterface1"
 cardinality="1..1" policy="static" bind="customBind" unbind="customUnbind"/>
   </scr:component>
+  <scr:component 
name="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$Service5">
+    <implementation 
class="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$Service5"/>
+    <service servicefactory="false">
+      <provide 
interface="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$ServiceInterface5"/>
+    </service>
+    <property name="service.pid" 
value="org.apache.sling.testing.mock.osgi.OsgiServiceUtilTest$Service5"/>
+  </scr:component>
 </components>


Reply via email to