You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by en...@apache.org on 2021/06/24 20:54:39 UTC

[sling-org-apache-sling-servlets-resolver] branch master updated: SLING-10507 Refactor tests to replace usage of deprecated apis (#17)

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

enorman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-resolver.git


The following commit(s) were added to refs/heads/master by this push:
     new fc4a51d  SLING-10507 Refactor tests to replace usage of deprecated apis (#17)
fc4a51d is described below

commit fc4a51d36284e8ae9fee455554bd991fae5f6e07
Author: Eric Norman <er...@gmail.com>
AuthorDate: Thu Jun 24 13:54:31 2021 -0700

    SLING-10507 Refactor tests to replace usage of deprecated apis (#17)
    
    use the Mock Resource Resolver Implementation from org.apache.sling.testing.resourceresolver-mock instead.
---
 pom.xml                                            |   6 +
 .../internal/SecureRequestsOptingServletTest.java  |  44 ++--
 .../internal/SlingServletResolverTestBase.java     |  93 +++-----
 .../resolver/internal/helper/HelperTestBase.java   |  74 +++++-
 .../internal/helper/LocationIteratorTest.java      | 256 +++++++++++++--------
 .../internal/helper/ResourceCollectorTest.java     |  63 ++---
 .../internal/helper/ScriptSelectionTest.java       |   4 +-
 .../internal/resource/MockServletResource.java     |  21 ++
 8 files changed, 321 insertions(+), 240 deletions(-)

diff --git a/pom.xml b/pom.xml
index a5c9899..420959a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -339,6 +339,12 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.testing.resourceresolver-mock</artifactId>
+            <version>1.2.2</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
         </dependency>
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java
index 31bc1e6..a5ba52a 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java
@@ -20,25 +20,25 @@ package org.apache.sling.servlets.resolver.internal;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.fail;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.servlet.Servlet;
 import javax.servlet.http.HttpServlet;
 
 import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.PersistenceException;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.servlets.OptingServlet;
-import org.apache.sling.api.servlets.ServletResolverConstants;
-import org.apache.sling.commons.testing.osgi.MockServiceReference;
-import org.apache.sling.commons.testing.sling.MockResource;
 import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest;
+import org.apache.sling.servlets.resolver.internal.helper.HelperTestBase;
 import org.apache.sling.servlets.resolver.internal.resource.MockServletResource;
+import org.apache.sling.servlets.resolver.internal.resource.ServletResource;
 import org.junit.Test;
 import org.osgi.framework.Bundle;
-import org.osgi.framework.Constants;
 
 public class SecureRequestsOptingServletTest extends SlingServletResolverTestBase {
 
@@ -50,28 +50,24 @@ public class SecureRequestsOptingServletTest extends SlingServletResolverTestBas
     protected void defineTestServlets(Bundle bundle) {
         testServlet = new SecureRequestsOptingServlet();
 
-        MockServiceReference ref = new MockServiceReference(bundle);
-        ref.setProperty(Constants.SERVICE_ID, 1L);
-        ref.setProperty(ServletResolverConstants.SLING_SERVLET_NAME, SERVLET_NAME);
-        ref.setProperty(ServletResolverConstants.SLING_SERVLET_PATHS, SERVLET_PATH);
-        ref.setProperty(ServletResolverConstants.SLING_SERVLET_EXTENSIONS, SERVLET_EXTENSION);
-
         String path = "/"
             + MockSlingHttpServletRequest.RESOURCE_TYPE
             + "/"
             + ResourceUtil.getName(MockSlingHttpServletRequest.RESOURCE_TYPE)
             + ".servlet";
-        MockServletResource res = new MockServletResource(mockResourceResolver,
-            testServlet, path);
-            mockResourceResolver.addResource(res);
-
-        MockResource parent = new MockResource(mockResourceResolver,
-            ResourceUtil.getParent(res.getPath()), "nt:folder");
-            mockResourceResolver.addResource(parent);
-
-        List<Resource> childRes = new ArrayList<>();
-        childRes.add(res);
-        mockResourceResolver.addChildren(parent, childRes);
+        Map<String, Object> props = new HashMap<>();
+        props.put(ResourceResolver.PROPERTY_RESOURCE_TYPE, path);
+        props.put("sling:resourceSuperType", ServletResource.DEFAULT_RESOURCE_SUPER_TYPE);
+        props.put(MockServletResource.PROP_SERVLET, testServlet);
+        HelperTestBase.addOrReplaceResource(mockResourceResolver, path, props);
+        try {
+            // commit so the resource is visible to the script resource resolver
+            //  that is created later and can't see the temporary resources in
+            //  this resource resolver
+            mockResourceResolver.commit();
+        } catch (PersistenceException e) {
+            fail("Did not expect a persistence exception: " + e.getMessage());
+        }
     }
 
     @Test public void testAcceptsSecureRequest() {
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTestBase.java b/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTestBase.java
index 5ec3674..0bc1788 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTestBase.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTestBase.java
@@ -19,15 +19,18 @@
 package org.apache.sling.servlets.resolver.internal;
 
 import java.lang.reflect.Field;
-import java.util.Collections;
-import java.util.List;
 import java.util.Map;
 
-import org.apache.sling.api.resource.LoginException;
+import javax.servlet.Servlet;
+
+import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.commons.testing.sling.MockResourceResolver;
+import org.apache.sling.api.wrappers.ResourceResolverWrapper;
 import org.apache.sling.servlets.resolver.internal.resolution.ResolutionCache;
+import org.apache.sling.servlets.resolver.internal.resource.MockServletResource;
+import org.apache.sling.testing.resourceresolver.DefaultMockResourceFactory;
+import org.apache.sling.testing.resourceresolver.MockResourceResolverFactory;
+import org.apache.sling.testing.resourceresolver.MockResourceResolverFactoryOptions;
 import org.junit.Before;
 import org.mockito.Mockito;
 import org.osgi.framework.Bundle;
@@ -35,9 +38,26 @@ import org.osgi.framework.BundleContext;
 
 public abstract class SlingServletResolverTestBase {
 
+    /**
+     * Custom factory that will create a MockServletResource for
+     * any resource whose path ends with .servlet and fallback
+     * to the default factory otherwise.
+     */
+    private static final class ServletMockResourceFactory extends DefaultMockResourceFactory {
+        @Override
+        public Resource newMockResource(String path, Map<String, Object> properties,
+                ResourceResolver resolver) {
+            if (path.endsWith(".servlet")) {
+                Servlet servlet = (Servlet)properties.get(MockServletResource.PROP_SERVLET);
+                return new MockServletResource(resolver, servlet, path);
+            }
+            return super.newMockResource(path, properties, resolver);
+        }
+    }
+
     protected SlingServletResolver servletResolver;
 
-    protected MockResourceResolver mockResourceResolver;
+    protected ResourceResolver mockResourceResolver;
 
     @Before public void setUp() throws Exception {
         final ResolverConfig config = Mockito.mock(ResolverConfig.class);
@@ -46,63 +66,12 @@ public abstract class SlingServletResolverTestBase {
         Mockito.when(config.servletresolver_defaultExtensions()).thenReturn(new String[] {"html"});
         Mockito.when(config.servletresolver_cacheSize()).thenReturn(200);
 
-        mockResourceResolver = new MockResourceResolver() {
-            @Override
-            public void close() {
-                // nothing to do;
-            }
-
-            @Override
-            public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
-                return null;
-            }
-
-            @Override
-            public ResourceResolver clone(Map<String, Object> authenticationInfo)
-                    throws LoginException {
-                throw new LoginException("MockResourceResolver can't be cloned - excepted for this test!");
-            }
-
-            @Override
-            public void refresh() {
-                // nothing to do
-            }
-        };
-        mockResourceResolver.setSearchPath("/");
+        MockResourceResolverFactoryOptions options = new MockResourceResolverFactoryOptions()
+            .setSearchPaths(new String[] {"/"})
+            .setMockResourceFactory(new ServletMockResourceFactory());
 
-        final ResourceResolverFactory factory = new ResourceResolverFactory() {
-
-            @Override
-            public ResourceResolver getAdministrativeResourceResolver(
-                    Map<String, Object> authenticationInfo)
-                    throws LoginException {
-                return mockResourceResolver;
-            }
-
-            @Override
-            public ResourceResolver getResourceResolver(
-                    Map<String, Object> authenticationInfo)
-                    throws LoginException {
-                return mockResourceResolver;
-            }
-
-            @Override
-            public ResourceResolver getServiceResourceResolver(Map<String, Object> authenticationInfo)
-                    throws LoginException {
-                return mockResourceResolver;
-            }
-
-            @Override
-            public ResourceResolver getThreadResourceResolver() {
-                // TODO Auto-generated method stub
-                return null;
-            }
-
-            @Override
-            public List<String> getSearchPath() {
-                return Collections.singletonList("/");
-            }
-        };
+        MockResourceResolverFactory factory = new MockResourceResolverFactory(options);
+        mockResourceResolver = new ResourceResolverWrapper(factory.getResourceResolver(null));
 
         servletResolver = new SlingServletResolver();
 
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/HelperTestBase.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/HelperTestBase.java
index 9ae1018..b626c25 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/HelperTestBase.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/HelperTestBase.java
@@ -18,20 +18,28 @@
  */
 package org.apache.sling.servlets.resolver.internal.helper;
 
-import junit.framework.TestCase;
+import java.util.Collections;
+import java.util.Map;
 
+import org.apache.sling.api.resource.PersistenceException;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceUtil;
-import org.apache.sling.commons.testing.sling.MockResource;
-import org.apache.sling.commons.testing.sling.MockResourceResolver;
 import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest;
+import org.apache.sling.testing.resourceresolver.MockResourceResolverFactory;
+import org.apache.sling.testing.resourceresolver.MockResourceResolverFactoryOptions;
+import org.jetbrains.annotations.Nullable;
+
+import junit.framework.TestCase;
 
 public abstract class HelperTestBase extends TestCase {
 
-    protected MockResourceResolver resourceResolver;
+    protected MockResourceResolverFactoryOptions resourceResolverOptions;
+    protected ResourceResolver resourceResolver;
 
     protected MockSlingHttpServletRequest request;
 
-    protected MockResource resource;
+    protected Resource resource;
 
     protected String resourcePath;
 
@@ -47,20 +55,66 @@ public abstract class HelperTestBase extends TestCase {
     protected void setUp() throws Exception {
         super.setUp();
 
-        resourceResolver = new MockResourceResolver();
-        resourceResolver.setSearchPath("/apps", "/libs");
+        resourceResolverOptions = new MockResourceResolverFactoryOptions();
+        MockResourceResolverFactory factory = new MockResourceResolverFactory(resourceResolverOptions);
+        resourceResolver = factory.getResourceResolver(null);
 
         resourceType = "foo:bar";
         resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType);
 
         resourcePath = "/content/page";
-        resource = new MockResource(resourceResolver, resourcePath,
-            resourceType);
-        resourceResolver.addResource(resource);
+        Resource parent = getOrCreateParentResource(resourceResolver, resourcePath);
+        resource = resourceResolver.create(parent, "page",
+                Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, resourceType));
 
         request = makeRequest("GET", "print.a4", "html");
     }
 
+    public static Resource addOrReplaceResource(ResourceResolver resolver, String path, String resourceType) {
+        return addOrReplaceResource(resolver, path, 
+                Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, resourceType));
+    }
+
+    public static Resource addOrReplaceResource(ResourceResolver resolver, String path, Map<String, Object> props) {
+        Resource res = null;
+        try {
+            // if the resource already exists, then remove it
+            @Nullable
+            Resource r = resolver.getResource(path);
+            if (r != null) {
+                resolver.delete(r);
+            } 
+
+            // create the new resource
+            Resource parent = getOrCreateParentResource(resolver, path);
+            res = resolver.create(parent, ResourceUtil.getName(path),
+                    props);
+        } catch (PersistenceException e) {
+            fail("Did not expect a persistence exception: " + e.getMessage());
+        }
+        return res;
+    };
+
+    public static Resource getOrCreateParentResource(ResourceResolver resolver, String path) throws PersistenceException {
+        Resource parent = null;
+        Resource tmp = resolver.getResource("/");
+        String[] segments = path.split("/");
+        for (int i = 1; i < segments.length - 1; i++) {
+            String name = segments[i];
+            @Nullable
+            Resource child = tmp.getChild(name);
+            if (child == null) {
+                tmp = resolver.create(tmp, name,
+                        Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, "nt:folder"));
+            } else {
+                tmp = child;
+            }
+        }
+        parent= tmp;
+
+        return parent;
+    }
+
     protected MockSlingHttpServletRequest makeRequest(String method, String selectors, String extension) {
         final MockSlingHttpServletRequest result =
             new MockSlingHttpServletRequest(resourcePath, selectors, extension, null, null);
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationIteratorTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationIteratorTest.java
index 450faa7..1a43385 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationIteratorTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/LocationIteratorTest.java
@@ -20,9 +20,13 @@ package org.apache.sling.servlets.resolver.internal.helper;
 
 import static org.apache.sling.api.servlets.ServletResolverConstants.DEFAULT_RESOURCE_TYPE;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.sling.api.resource.PersistenceException;
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceUtil;
-import org.apache.sling.commons.testing.sling.MockResource;
 
 public class LocationIteratorTest extends HelperTestBase {
 
@@ -43,7 +47,7 @@ public class LocationIteratorTest extends HelperTestBase {
 
     public void testSearchPathEmpty() {
         // expect path gets { "/" }
-        resourceResolver.setSearchPath((String[]) null);
+        resourceResolverOptions.setSearchPaths(null);
 
         final Resource r = request.getResource();
         LocationIterator li = getLocationIterator(r.getResourceType(),
@@ -62,8 +66,10 @@ public class LocationIteratorTest extends HelperTestBase {
     }
 
     public void testSearchPath1Element() {
-        String root0 = "/apps";
-        resourceResolver.setSearchPath(root0);
+        String root0 = "/apps/";
+        resourceResolverOptions.setSearchPaths(new String[] {
+                root0
+        });
 
         final Resource r = request.getResource();
         LocationIterator li = getLocationIterator(r.getResourceType(),
@@ -71,20 +77,23 @@ public class LocationIteratorTest extends HelperTestBase {
 
         // 1. /apps/foo/bar
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + resourceTypePath, li.next());
+        assertEquals(root0 + resourceTypePath, li.next());
 
         // 2. /apps/sling/servlet/default
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root0 + DEFAULT_RESOURCE_TYPE, li.next());
 
         // 3. finished
         assertFalse(li.hasNext());
     }
 
     public void testSearchPath2Elements() {
-        String root0 = "/apps";
-        String root1 = "/libs";
-        resourceResolver.setSearchPath(root0, root1);
+        String root0 = "/apps/";
+        String root1 = "/libs/";
+        resourceResolverOptions.setSearchPaths(new String[] {
+                root0,
+                root1
+        });
 
         final Resource r = request.getResource();
         LocationIterator li = getLocationIterator(r.getResourceType(),
@@ -92,32 +101,53 @@ public class LocationIteratorTest extends HelperTestBase {
 
         // 1. /apps/foo/bar
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + resourceTypePath, li.next());
+        assertEquals(root0 + resourceTypePath, li.next());
 
         // 2. /libs/foo/bar
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/" + resourceTypePath, li.next());
+        assertEquals(root1 + resourceTypePath, li.next());
 
         // 3. /apps/sling/servlet/default
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root0 + DEFAULT_RESOURCE_TYPE, li.next());
 
         // 4. /libs/sling/servlet/default
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root1 + DEFAULT_RESOURCE_TYPE, li.next());
 
         // 5. finished
         assertFalse(li.hasNext());
     }
 
+    /**
+     * Replace a resource with a different type
+     * 
+     * @param res the resource to replace
+     * @param newResourceType the new resource type, or null to not change it
+     * @param newResourceSuperType the new resource super type, or null to not change it
+     * @return the new resource
+     */
+    protected void replaceResource(String newResourceType, String newResourceSuperType) {
+        @SuppressWarnings("unchecked")
+        Map<String, Object> props = new HashMap<>(resource.adaptTo(Map.class));
+        if (newResourceType != null) {
+            props.put(ResourceResolver.PROPERTY_RESOURCE_TYPE, newResourceType);
+        }
+        if (newResourceSuperType != null) {
+            props.put("sling:resourceSuperType", newResourceSuperType);
+        }
+        Resource r = addOrReplaceResource(resourceResolver, resource.getPath(), props);
+        request.setResource(r);
+    }
+
     public void testSearchPathEmptyAbsoluteType() {
         // expect path gets { "/" }
-        resourceResolver.setSearchPath((String[]) null);
+        resourceResolverOptions.setSearchPaths(null);
 
         // absolute resource type
         resourceType = "/foo/bar";
         resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType);
-        resource.setResourceType(resourceType);
+        replaceResource(resourceType, null);
 
         final Resource r = request.getResource();
         LocationIterator li = getLocationIterator(r.getResourceType(),
@@ -136,13 +166,15 @@ public class LocationIteratorTest extends HelperTestBase {
     }
 
     public void testSearchPath1ElementAbsoluteType() {
-        String root0 = "/apps";
-        resourceResolver.setSearchPath(root0);
+        String root0 = "/apps/";
+        resourceResolverOptions.setSearchPaths(new String[] {
+                root0
+        });
 
         // absolute resource type
         resourceType = "/foo/bar";
         resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType);
-        resource.setResourceType(resourceType);
+        replaceResource(resourceType, null);
 
         final Resource r = request.getResource();
         LocationIterator li = getLocationIterator(r.getResourceType(),
@@ -154,21 +186,24 @@ public class LocationIteratorTest extends HelperTestBase {
 
         // 2. /apps/sling/servlet/default
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root0 + DEFAULT_RESOURCE_TYPE, li.next());
 
         // 3. finished
         assertFalse(li.hasNext());
     }
 
     public void testSearchPath2ElementsAbsoluteType() {
-        String root0 = "/apps";
-        String root1 = "/libs";
-        resourceResolver.setSearchPath(root0, root1);
+        String root0 = "/apps/";
+        String root1 = "/libs/";
+        resourceResolverOptions.setSearchPaths(new String[] {
+                root0,
+                root1
+        });
 
         // absolute resource type
         resourceType = "/foo/bar";
         resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType);
-        resource.setResourceType(resourceType);
+        replaceResource(resourceType, null);
 
         final Resource r = request.getResource();
         LocationIterator li = getLocationIterator(r.getResourceType(),
@@ -180,11 +215,11 @@ public class LocationIteratorTest extends HelperTestBase {
 
         // 2. /apps/sling/servlet/default
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root0 + DEFAULT_RESOURCE_TYPE, li.next());
 
         // 3. /libs/sling/servlet/default
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root1 + DEFAULT_RESOURCE_TYPE, li.next());
 
         // 4. finished
         assertFalse(li.hasNext());
@@ -192,12 +227,12 @@ public class LocationIteratorTest extends HelperTestBase {
 
     public void testSearchPathEmptyWithSuper() {
         // expect path gets { "/" }
-        resourceResolver.setSearchPath((String[]) null);
+        resourceResolverOptions.setSearchPaths(null);
 
         // set resource super type
         resourceSuperType = "foo:superBar";
         resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType);
-        resource.setResourceSuperType(resourceSuperType);
+        replaceResource(null, resourceSuperType);
 
         final Resource r = request.getResource();
         LocationIterator li = getLocationIterator(r.getResourceType(),
@@ -220,13 +255,15 @@ public class LocationIteratorTest extends HelperTestBase {
     }
 
     public void testSearchPath1ElementWithSuper() {
-        String root0 = "/apps";
-        resourceResolver.setSearchPath(root0);
+        String root0 = "/apps/";
+        resourceResolverOptions.setSearchPaths(new String[] {
+                root0
+        });
 
         // set resource super type
         resourceSuperType = "foo:superBar";
         resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType);
-        resource.setResourceSuperType(resourceSuperType);
+        replaceResource(null, resourceSuperType);
 
         final Resource r = request.getResource();
         LocationIterator li = getLocationIterator(r.getResourceType(),
@@ -234,29 +271,32 @@ public class LocationIteratorTest extends HelperTestBase {
 
         // 1. /apps/foo/bar
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + resourceTypePath, li.next());
+        assertEquals(root0 + resourceTypePath, li.next());
 
         // 2. /apps/foo/superBar
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + resourceSuperTypePath, li.next());
+        assertEquals(root0 + resourceSuperTypePath, li.next());
 
         // 3. /apps/sling/servlet/default
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root0 + DEFAULT_RESOURCE_TYPE, li.next());
 
         // 4. finished
         assertFalse(li.hasNext());
     }
 
     public void testSearchPath2ElementsWithSuper() {
-        String root0 = "/apps";
-        String root1 = "/libs";
-        resourceResolver.setSearchPath(root0, root1);
+        String root0 = "/apps/";
+        String root1 = "/libs/";
+        resourceResolverOptions.setSearchPaths(new String[] {
+                root0,
+                root1
+        });
 
         // set resource super type
         resourceSuperType = "foo:superBar";
         resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType);
-        resource.setResourceSuperType(resourceSuperType);
+        replaceResource(null, resourceSuperType);
 
         final Resource r = request.getResource();
         LocationIterator li = getLocationIterator(r.getResourceType(),
@@ -264,27 +304,27 @@ public class LocationIteratorTest extends HelperTestBase {
 
         // 1. /apps/foo/bar
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + resourceTypePath, li.next());
+        assertEquals(root0 + resourceTypePath, li.next());
 
         // 2. /libs/foo/bar
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/" + resourceTypePath, li.next());
+        assertEquals(root1 + resourceTypePath, li.next());
 
         // 3. /apps/foo/superBar
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + resourceSuperTypePath, li.next());
+        assertEquals(root0 + resourceSuperTypePath, li.next());
 
         // 4. /libs/foo/superBar
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/" + resourceSuperTypePath, li.next());
+        assertEquals(root1 + resourceSuperTypePath, li.next());
 
         // 5. /apps/sling/servlet/default
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root0 + DEFAULT_RESOURCE_TYPE, li.next());
 
         // 6. /libs/sling/servlet/default
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root1 + DEFAULT_RESOURCE_TYPE, li.next());
 
         // 7. finished
         assertFalse(li.hasNext());
@@ -292,17 +332,16 @@ public class LocationIteratorTest extends HelperTestBase {
 
     public void testSearchPathEmptyAbsoluteTypeWithSuper() {
         // expect path gets { "/" }
-        resourceResolver.setSearchPath((String[]) null);
+        resourceResolverOptions.setSearchPaths(null);
 
         // absolute resource type
         resourceType = "/foo/bar";
         resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType);
-        resource.setResourceType(resourceType);
 
         // set resource super type
         resourceSuperType = "foo:superBar";
         resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType);
-        resource.setResourceSuperType(resourceSuperType);
+        replaceResource(resourceType, resourceSuperType);
 
         final Resource r = request.getResource();
         LocationIterator li = getLocationIterator(r.getResourceType(),
@@ -325,18 +364,19 @@ public class LocationIteratorTest extends HelperTestBase {
     }
 
     public void testSearchPath1ElementAbsoluteTypeWithSuper() {
-        String root0 = "/apps";
-        resourceResolver.setSearchPath(root0);
+        String root0 = "/apps/";
+        resourceResolverOptions.setSearchPaths(new String[] {
+                root0
+        });
 
         // absolute resource type
         resourceType = "/foo/bar";
         resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType);
-        resource.setResourceType(resourceType);
 
         // set resource super type
         resourceSuperType = "foo:superBar";
         resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType);
-        resource.setResourceSuperType(resourceSuperType);
+        replaceResource(resourceType, resourceSuperType);
 
         final Resource r = request.getResource();
         LocationIterator li = getLocationIterator(r.getResourceType(),
@@ -348,30 +388,32 @@ public class LocationIteratorTest extends HelperTestBase {
 
         // 2. /apps/foo/superBar
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + resourceSuperTypePath, li.next());
+        assertEquals(root0 + resourceSuperTypePath, li.next());
 
         // 3. /apps/sling/servlet/default
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root0 + DEFAULT_RESOURCE_TYPE, li.next());
 
         // 4. finished
         assertFalse(li.hasNext());
     }
 
     public void testSearchPath2ElementsAbsoluteTypeWithSuper() {
-        String root0 = "/apps";
-        String root1 = "/libs";
-        resourceResolver.setSearchPath(root0, root1);
+        String root0 = "/apps/";
+        String root1 = "/libs/";
+        resourceResolverOptions.setSearchPaths(new String[] {
+                root0,
+                root1
+        });
 
         // absolute resource type
         resourceType = "/foo/bar";
         resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType);
-        resource.setResourceType(resourceType);
 
         // set resource super type
         resourceSuperType = "foo:superBar";
         resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType);
-        resource.setResourceSuperType(resourceSuperType);
+        replaceResource(resourceType, resourceSuperType);
 
         final Resource r = request.getResource();
         LocationIterator li = getLocationIterator(r.getResourceType(),
@@ -383,28 +425,31 @@ public class LocationIteratorTest extends HelperTestBase {
 
         // 2. /apps/foo/superBar
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + resourceSuperTypePath, li.next());
+        assertEquals(root0 + resourceSuperTypePath, li.next());
 
         // 3. /libs/foo/superBar
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/" + resourceSuperTypePath, li.next());
+        assertEquals(root1 + resourceSuperTypePath, li.next());
 
         // 4. /apps/sling/servlet/default
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root0 + DEFAULT_RESOURCE_TYPE, li.next());
 
         // 5. /libs/sling/servlet/default
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root1 + DEFAULT_RESOURCE_TYPE, li.next());
 
         // 6. finished
         assertFalse(li.hasNext());
     }
 
     public void testScriptNameWithoutResourceType() {
-        String root0 = "/apps";
-        String root1 = "/libs";
-        resourceResolver.setSearchPath(root0, root1);
+        String root0 = "/apps/";
+        String root1 = "/libs/";
+        resourceResolverOptions.setSearchPaths(new String[] {
+                root0,
+                root1
+        });
         LocationIterator li = getLocationIterator("",
                 null,
                 "");
@@ -416,79 +461,102 @@ public class LocationIteratorTest extends HelperTestBase {
     }
 
     public void testScriptNameWithResourceType() {
-        String root0 = "/apps";
-        String root1 = "/libs";
-        resourceResolver.setSearchPath(root0, root1);
+        String root0 = "/apps/";
+        String root1 = "/libs/";
+        resourceResolverOptions.setSearchPaths(new String[] {
+                root0,
+                root1
+        });
         LocationIterator li = getLocationIterator("a/b",
                 null);
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/a/b", li.next());
+        assertEquals(root0 + "a/b", li.next());
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/a/b", li.next());
+        assertEquals(root1 + "a/b", li.next());
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root0 + DEFAULT_RESOURCE_TYPE, li.next());
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root1 + DEFAULT_RESOURCE_TYPE, li.next());
         assertFalse(li.hasNext());
     }
 
     public void testScriptNameWithResourceTypeAndSuperType() {
-        String root0 = "/apps";
-        String root1 = "/libs";
-        resourceResolver.setSearchPath(root0, root1);
+        String root0 = "/apps/";
+        String root1 = "/libs/";
+        resourceResolverOptions.setSearchPaths(new String[] {
+                root0,
+                root1
+        });
         LocationIterator li = getLocationIterator("a/b",
                 "c/d");
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/a/b", li.next());
+        assertEquals(root0 + "a/b", li.next());
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/a/b", li.next());
+        assertEquals(root1 + "a/b", li.next());
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/c/d", li.next());
+        assertEquals(root0 + "c/d", li.next());
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/c/d", li.next());
+        assertEquals(root1 + "c/d", li.next());
         assertTrue(li.hasNext());
-        assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root0 + DEFAULT_RESOURCE_TYPE, li.next());
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root1 + DEFAULT_RESOURCE_TYPE, li.next());
         assertFalse(li.hasNext());
     }
 
     public void testCircularResourceTypeHierarchy() {
-        final String root1 = "/libs";
-        resourceResolver.setSearchPath(root1);
+        final String root1 = "/libs/";
+        resourceResolverOptions.setSearchPaths(new String[] {
+                root1
+        });
 
         // resource type and super type for start resource
         final String resourceType = "foo/bar";
         final String resourceSuperType = "foo/check1";
         final String resourceSuperType2 = "foo/check2";
 
-        final Resource resource2 = new MockResource(resourceResolver,
-                root1 + '/' + resourceSuperType,
-                resourceType, resourceSuperType2);
-        resourceResolver.addResource(resource2);
-        final Resource resource3 = new MockResource(resourceResolver,
-                root1 + '/' + resourceSuperType2,
-                resourceType, resourceType);
-        resourceResolver.addResource(resource3);
+        String resource2Path = root1 + resourceSuperType;
+        Map<String, Object> resource2Props = new HashMap<>();
+        resource2Props.put(ResourceResolver.PROPERTY_RESOURCE_TYPE, resourceType);
+        resource2Props.put("sling:resourceSuperType", resourceSuperType2);
+        try {
+            resourceResolver.create(getOrCreateParentResource(resourceResolver, resource2Path),
+                    ResourceUtil.getName(resource2Path),
+                    resource2Props);
+        } catch (PersistenceException e) {
+            fail("Did not expect a persistence exception: " + e.getMessage());
+        }
+
+        String resource3Path = root1 + resourceSuperType2;
+        Map<String, Object> resource3Props = new HashMap<>();
+        resource3Props.put(ResourceResolver.PROPERTY_RESOURCE_TYPE, resourceType);
+        resource3Props.put("sling:resourceSuperType", resourceType);
+        try {
+            resourceResolver.create(getOrCreateParentResource(resourceResolver, resource3Path),
+                    ResourceUtil.getName(resource3Path),
+                    resource3Props);
+        } catch (PersistenceException e) {
+            fail("Did not expect a persistence exception: " + e.getMessage());
+        }
 
         LocationIterator li = getLocationIterator(resourceType,
                 resourceSuperType);
 
         // 1. /libs/foo/bar
         assertTrue(li.hasNext());
-        assertEquals(root1 + '/' + resourceType, li.next());
+        assertEquals(root1 + resourceType, li.next());
 
         // 1. /libs/foo/check1
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/" + resourceSuperType, li.next());
+        assertEquals(root1 + resourceSuperType, li.next());
 
         // 3. /libs/foo/check2
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/" + resourceSuperType2, li.next());
+        assertEquals(root1 + resourceSuperType2, li.next());
 
         // 4. /libs/sling/servlet/default
         assertTrue(li.hasNext());
-        assertEquals(root1 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
+        assertEquals(root1 + DEFAULT_RESOURCE_TYPE, li.next());
 
         // 5. finished
         assertFalse(li.hasNext());
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java
index faf664c..7da2270 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java
@@ -28,7 +28,6 @@ import java.util.Map;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceUtil;
-import org.apache.sling.commons.testing.sling.MockResource;
 
 public class ResourceCollectorTest extends HelperTestBase {
 
@@ -49,9 +48,7 @@ public class ResourceCollectorTest extends HelperTestBase {
                 "/print.esp", // 4
                 "/print/a4.esp", // 5
                 "/print.html.esp", // 6
-                "/print/a4.html.esp", // 7
-                "/print", // resource to enable walking the tree
-                "/print", // resource to enable walking the tree
+                "/print/a4.html.esp" // 7
         };
 
         int[] baseIdxs = { 0, 1, 1, 0, 0, 1, 0, 1, 0, 1 };
@@ -68,9 +65,7 @@ public class ResourceCollectorTest extends HelperTestBase {
                 "/print.other.esp", // 4
                 "/print/other.esp", // 5
                 "/print.html.esp", // 6
-                "/print/a4.html.esp", // 7
-                "/print", // resource to enable walking the tree
-                "/print", // resource to enable walking the tree
+                "/print/a4.html.esp" // 7
         };
 
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
@@ -88,9 +83,7 @@ public class ResourceCollectorTest extends HelperTestBase {
                 "/print/other.esp", // 5
                 "/print.other.esp", // 6
                 "/print.html.esp", // 7
-                "/print/a4.html.esp", // 8
-                "/print", // resource to enable walking the tree
-                "/print", // resource to enable walking the tree
+                "/print/a4.html.esp" // 8
         };
 
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
@@ -109,9 +102,7 @@ public class ResourceCollectorTest extends HelperTestBase {
                 "/print/other.esp", // 6
                 "/print.other.esp", // 7
                 "/print.html.esp", // 8
-                "/print/a4.html.esp", // 9
-                "/print", // resource to enable walking the tree
-                "/print", // resource to enable walking the tree
+                "/print/a4.html.esp" // 9
         };
 
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
@@ -131,9 +122,7 @@ public class ResourceCollectorTest extends HelperTestBase {
                 "/print/other.esp", // 7
                 "/print.other.esp", // 8
                 "/print.html.esp", // 9
-                "/print/a4.html.esp", // 10
-                "/print", // resource to enable walking the tree
-                "/print", // resource to enable walking the tree
+                "/print/a4.html.esp" // 10
         };
 
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1 };
@@ -168,9 +157,7 @@ public class ResourceCollectorTest extends HelperTestBase {
                 "/print/a4.html.esp", // 10    /libs/foo/bar/print/a4.html.esp
                 "/print/a4.html.js", // 11     /libs/foo/bar/print/a4.html.js
                 "/print/a4.html.html", // 12   /apps/foo/bar/print/a4.html.html
-                "/print/a4.html.jsp", // 13    /apps/foo/bar/print/a4.html.jsp
-                "/print", // resource to enable walking the tree
-                "/print", // resource to enable walking the tree
+                "/print/a4.html.jsp" // 13    /apps/foo/bar/print/a4.html.jsp
         };
 
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0};
@@ -201,9 +188,7 @@ public class ResourceCollectorTest extends HelperTestBase {
                 "/print/a4.html.esp", // 10    /libs/foo/bar/print/a4.html.esp
                 "/print/a4.html.js", // 11     /libs/foo/bar/print/a4.html.js
                 "/print/a4.html.html", // 12   /apps/foo/bar/print/a4.html.html will win (overlays libs, comes before jsp when iterating)
-                "/print/a4.html.jsp", // 13    /apps/foo/bar/print/a4.html.jsp
-                "/print", // resource to enable walking the tree
-                "/print", // resource to enable walking the tree
+                "/print/a4.html.jsp" // 13    /apps/foo/bar/print/a4.html.jsp
         };
 
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0};
@@ -232,9 +217,7 @@ public class ResourceCollectorTest extends HelperTestBase {
                 "/print/a4.html.esp", // 10    /libs/foo/bar/print/a4.html.esp
                 "/print/a4.html.js", // 11     /libs/foo/bar/print/a4.html.js
                 "/print/a4.html.jsp", // 12    /apps/foo/bar/print/a4.html.jsp will win (overlays libs, comes before html when iterating)
-                "/print/a4.html.html", // 13   /apps/foo/bar/print/a4.html.html
-                "/print", // resource to enable walking the tree
-                "/print", // resource to enable walking the tree
+                "/print/a4.html.html" // 13   /apps/foo/bar/print/a4.html.html
         };
 
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0};
@@ -259,9 +242,7 @@ public class ResourceCollectorTest extends HelperTestBase {
                 "/print.ANY.esp", // 4
                 "/print/a4.ANY.esp", // 5
                 "/print.html.ANY.esp", // 6
-                "/print/a4.html.ANY.esp", // 7
-                "/print", // resource to enable walking the tree
-                "/print", // resource to enable walking the tree
+                "/print/a4.html.ANY.esp" // 7
         };
 
         int[] baseIdxs = { 0, 1, 1, 0, 0, 1, 0, 1, 0, 1 };
@@ -281,9 +262,7 @@ public class ResourceCollectorTest extends HelperTestBase {
                 "/print.other.ANY.esp", // 4
                 "/print/other.ANY.esp", // 5
                 "/print.html.ANY.esp", // 6
-                "/print/a4.html.ANY.esp", // 7
-                "/print", // resource to enable walking the tree
-                "/print", // resource to enable walking the tree
+                "/print/a4.html.ANY.esp" // 7
         };
 
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
@@ -304,9 +283,7 @@ public class ResourceCollectorTest extends HelperTestBase {
                 "/print/other.ANY.esp", // 5
                 "/print.other.ANY.esp", // 6
                 "/print.html.ANY.esp", // 7
-                "/print/a4.html.ANY.esp", // 8
-                "/print", // resource to enable walking the tree
-                "/print", // resource to enable walking the tree
+                "/print/a4.html.ANY.esp" // 8
         };
 
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
@@ -328,9 +305,7 @@ public class ResourceCollectorTest extends HelperTestBase {
                 "/print/other.ANY.esp", // 6
                 "/print.other.ANY.esp", // 7
                 "/print.html.ANY.esp", // 8
-                "/print/a4.html.ANY.esp", // 9
-                "/print", // resource to enable walking the tree
-                "/print", // resource to enable walking the tree
+                "/print/a4.html.ANY.esp" // 9
         };
 
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
@@ -353,9 +328,7 @@ public class ResourceCollectorTest extends HelperTestBase {
                 "/print/other.ANY.esp", // 7
                 "/print.other.ANY.esp", // 8
                 "/print.html.ANY.esp", // 9
-                "/print/a4.html.ANY.esp", // 10
-                "/print", // resource to enable walking the tree
-                "/print", // resource to enable walking the tree
+                "/print/a4.html.ANY.esp" // 10
         };
 
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1 };
@@ -381,9 +354,7 @@ public class ResourceCollectorTest extends HelperTestBase {
                 "/print/a4.html.ANY.esp", // 10    /libs/foo/bar/print/a4.html.ANY.esp
                 "/print/a4.html.ANY.js", // 11     /libs/foo/bar/print/a4.html.ANY.js
                 "/print/a4.html.ANY.html", // 12   /apps/foo/bar/print/a4.html.ANY.html
-                "/print/a4.html.ANY.jsp", // 13    /apps/foo/bar/print/a4.html.ANY.jsp
-                "/print", // resource to enable walking the tree
-                "/print", // resource to enable walking the tree
+                "/print/a4.html.ANY.jsp" // 13    /apps/foo/bar/print/a4.html.ANY.jsp
         };
 
         int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0};
@@ -441,9 +412,7 @@ public class ResourceCollectorTest extends HelperTestBase {
         assertFalse(rIter.hasNext());
     }
 
-    protected MockResource createScriptResource(String path, String type) {
-        MockResource res = new MockResource(resourceResolver, path, type);
-        resourceResolver.addResource(res);
-        return res;
+    protected Resource createScriptResource(String path, String type) {
+        return addOrReplaceResource(resourceResolver, path, type);
     }
 }
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java
index 6017c9d..251231f 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java
@@ -22,7 +22,6 @@ import java.util.Collection;
 import java.util.Collections;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.commons.testing.sling.MockResource;
 import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest;
 
 /** Various tests that explain and demonstrate how scripts are
@@ -63,8 +62,7 @@ public class ScriptSelectionTest extends HelperTestBase {
     {
         // Add given scripts to our mock resource resolver
         for(String script : scripts) {
-            final MockResource r = new MockResource(resourceResolver, script, "nt:file");
-            resourceResolver.addResource(r);
+            addOrReplaceResource(resourceResolver, script, "nt:file");
         }
 
         // Create mock request and get scripts from ResourceCollector
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/resource/MockServletResource.java b/src/test/java/org/apache/sling/servlets/resolver/internal/resource/MockServletResource.java
index ec3f0ba..9cce235 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/resource/MockServletResource.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/resource/MockServletResource.java
@@ -21,11 +21,32 @@ package org.apache.sling.servlets.resolver.internal.resource;
 import javax.servlet.Servlet;
 
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.api.wrappers.ValueMapDecorator;
 
 public class MockServletResource extends
         org.apache.sling.servlets.resolver.internal.resource.ServletResource {
+
+    public static final String PROP_SERVLET = ":servlet";
+
+    private final Servlet servlet;
+
     public MockServletResource(ResourceResolver resourceResolver,
             Servlet servlet, String path) {
         super(resourceResolver, servlet, path);
+        this.servlet = servlet;
     }
+
+    @Override
+    public <T> T adaptTo(Class<T> type) {
+        if ( type == ValueMap.class ) {
+            ValueMapDecorator vm = (ValueMapDecorator)super.adaptTo(type);
+            // add the servlet to the ValueMap so we don't lose track of it
+            //  when resource objects are created during traversal
+            vm.put(PROP_SERVLET, servlet);
+            return type.cast(vm);
+        }
+        return super.adaptTo(type);
+    }
+
 }