diff --git a/src/test/java/org/apache/sling/capabilities/jcr/SearchSourceTest.java b/src/test/java/org/apache/sling/capabilities/jcr/SearchSourceTest.java
index 27e716a..7f72acf 100644
--- a/src/test/java/org/apache/sling/capabilities/jcr/SearchSourceTest.java
+++ b/src/test/java/org/apache/sling/capabilities/jcr/SearchSourceTest.java
@@ -30,6 +30,7 @@
 import org.apache.sling.capabilities.CapabilitiesSource;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.serviceusermapping.ServiceUserMapped;
+import org.apache.sling.testing.mock.osgi.ReferenceViolationException;
 import org.apache.sling.testing.mock.sling.ResourceResolverType;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
 import static org.junit.Assert.assertEquals;
@@ -58,12 +59,18 @@
         return props;
     }
 
-    private void registerSearchSource(Object ... configNameValuePairs) throws IOException {
+    private void registerSearchSource(boolean withServiceUserMapped, Object ... configNameValuePairs) throws IOException {
         final ConfigurationAdmin ca = context.getService(ConfigurationAdmin.class);
         assertNotNull("Expecting a ConfigurationAdmin service", ca);
         final Configuration cfg = ca.getConfiguration(SearchSource.class.getName());
         cfg.update(props(configNameValuePairs));
 
+        if(withServiceUserMapped) {
+            final ServiceUserMapped sum = new ServiceUserMapped() {};
+            context.registerService(ServiceUserMapped.class, sum,
+                props(ServiceUserMapped.SUBSERVICENAME, SearchSource.SUBSERVICE_NAME));
+        }
+
         final SearchSource ss = new SearchSource();
         context.registerInjectActivateService(ss);
 
@@ -85,35 +92,33 @@
         }
     }
 
-    @Before
-    public void setup() throws IOException {
-
-        final ServiceUserMapped sum = new ServiceUserMapped() {};
-        context.registerService(ServiceUserMapped.class, sum, 
-                props(ServiceUserMapped.SUBSERVICENAME, SearchSource.SUBSERVICE_NAME));
-    }
-
     @Test
     public void testNoSimilarity() throws Exception {
-        registerSearchSource();
+        registerSearchSource(true);
         assertNotNull(searchSource.getCapabilities());
         assertEquals("false", searchSource.getCapabilities().get(SIMILARITY_ACTIVE_CAP));
     }
 
     @Test
     public void testHasSimilarity() throws Exception {
-        registerSearchSource();
+        registerSearchSource(true);
         createMockIndexNode("/oak:index", "foo", "useInSimilarity", true);
 
         assertNotNull(searchSource.getCapabilities());
         assertEquals("true", searchSource.getCapabilities().get(SIMILARITY_ACTIVE_CAP));
     }
 
+    @Test(expected=ReferenceViolationException.class)
+    public void testNoServiceUserMapped() throws Exception {
+        registerSearchSource(false);
+    }
+
     @Test
     public void testCustomQueryAndCacheLifetime() throws Exception {
         final int lifetimeSeconds = 2;
         final String uniquePath = "testCustomQuery_" + UUID.randomUUID();
         registerSearchSource(
+                true,
                 "similarityIndexQuery", "/jcr:root/" + uniquePath,
                 "cacheLifetimeSeconds", lifetimeSeconds);
 
