Hi @robertharper,
For the snippet that you have shared now, here is the Test class, you can use this as is and check if it works now.
Changes done (on top of what you shared)
- Mocked ResourceResolverFactory (via @Mock)
- @Mock
private ResourceResolverFactory rescResolverFactory;
- Added MockitoExtension.class to @ExtendWith (for using @Mock)
- @ExtendWith({AemContextExtension.class, MockitoExtension.class})
- Removed the AemContext from doGet argument and instantiated explicitly with ResourceResolverType as RESOURCERESOLVER_MOCK
- private AemContext context = new AemContext(ResourceResolverType.RESOURCERESOLVER_MOCK);
package com.mysite.core.servlets;
import java.io.IOException;
import javax.servlet.ServletException;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.testing.mock.sling.ResourceResolverType;
import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletRequest;
import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletResponse;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import io.wcm.testing.mock.aem.junit5.AemContext;
import io.wcm.testing.mock.aem.junit5.AemContextExtension;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.junit.jupiter.api.Assertions.assertEquals;
@ExtendWith({AemContextExtension.class, MockitoExtension.class})
class SimpleServletTest {
@Mock
private ResourceResolverFactory resourceResolverFactory;
private AemContext context = new AemContext(ResourceResolverType.RESOURCERESOLVER_MOCK);
@InjectMocks
private SimpleServlet fixture = new SimpleServlet();
@Test
void doGet() throws ServletException, IOException {
context.build().resource("/content/test", "jcr:title", "resource title").commit();
context.currentResource("/content/test");
MockSlingHttpServletRequest request = context.request();
MockSlingHttpServletResponse response = context.response();
fixture.doGet(request, response);
assertEquals("Title = resource title", response.getOutputAsString());
}
}Once when you see the above working, you can try the below.
For creating ResourceResolver out of this mocked ResourceResolverFactory, we need to introduce when and thenReturn
Map<String, Object> map = new HashMap<>();
map.put(ResourceResolverFactory.SUBSERVICE, "demoproject-service");
/* Getting Resolver from current AemContext */
ResourceResolver resourceResolver = context.request().getResourceResolver();
/*Using the resolver from previous step for thenReturn */
when(rescResolverFactory.getServiceResourceResolver(map)).thenReturn(resourceResolver);
Update : (Corrected the typo on variable name of mocked ResourceResolverFactory)
when(resourceResolverFactory.getServiceResourceResolver(map)).thenReturn(resourceResolver);