[
https://issues.apache.org/jira/browse/SLING-7182?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Gustavo Doriguetto resolved SLING-7182.
---------------------------------------
Resolution: Fixed
> No OSGi SCR metadata found on test case
> ---------------------------------------
>
> Key: SLING-7182
> URL: https://issues.apache.org/jira/browse/SLING-7182
> Project: Sling
> Issue Type: Test
> Components: Testing
> Affects Versions: Testing Sling Mock 2.2.10
> Reporter: Gustavo Doriguetto
>
> I have the following servlet, referencing a "QueryBuilder" service
> {code:java}
> import com.day.cq.search.PredicateGroup;
> import com.day.cq.search.Query;
> import com.day.cq.search.QueryBuilder;
> import com.day.cq.search.result.Hit;
> import com.day.cq.search.result.SearchResult;
> import org.apache.sling.api.SlingHttpServletRequest;
> import org.apache.sling.api.SlingHttpServletResponse;
> import org.apache.sling.api.servlets.HttpConstants;
> import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
> import org.apache.sling.commons.json.JSONArray;
> import org.apache.sling.commons.json.JSONException;
> import org.apache.sling.commons.json.JSONObject;
> import org.osgi.framework.Constants;
> import org.osgi.service.component.annotations.Component;
> import org.osgi.service.component.annotations.Reference;
> import javax.jcr.RepositoryException;
> import javax.jcr.Session;
> import javax.servlet.Servlet;
> import javax.servlet.ServletException;
> import java.io.IOException;
> import java.io.PrintWriter;
> import java.util.HashMap;
> import java.util.Map;
> @Component(service=Servlet.class,
> property={
> Constants.SERVICE_DESCRIPTION + "=Simple Demo Servlet",
> "sling.servlet.methods=" + HttpConstants.METHOD_GET,
> "sling.servlet.resourceTypes="+
> "bb/components/structure/page",
> "sling.servlet.extensions=" + "json"
> })
> public class SimpleServlet extends SlingSafeMethodsServlet {
> private static final long serialVersionUid = 1L;
> @Reference
> QueryBuilder queryBuilder;
> @Override
> protected void doGet(final SlingHttpServletRequest req,
> final SlingHttpServletResponse resp) throws ServletException,
> IOException {
> resp.setContentType("application/json");
> Map<String, String> tilesMap = new HashMap<String, String>();
> tilesMap.put("path", req.getResource().getPath());
> Query result =
> queryBuilder.createQuery(PredicateGroup.create(tilesMap),
> req.getResourceResolver().adaptTo(Session.class));
> SearchResult searchResult = result.getResult();
> JSONObject json = new JSONObject();
> try {
> JSONArray jsonArray = new JSONArray();
> for(Hit hit: searchResult.getHits()) {
> JSONObject item = new JSONObject();
> item.put("text", hit.getProperties().get("text",
> String.class));
> jsonArray.put(item);
> }
> json.put("items", jsonArray);
> } catch (JSONException | RepositoryException e) {
> // Servlet failures should always return an approriate HTTP
> Status code
> resp.setStatus(SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR);
> // If you do not set your own HTML Response content, the OOTB
> HATEOS Response is used
> resp.getWriter().write("ERROR");
> e.printStackTrace();
> }
> PrintWriter out = resp.getWriter();
> out.print(json.toString());
> }
> }
> {code}
> with the following test case:
> {code:java}
> import com.day.cq.search.QueryBuilder;
> import org.apache.sling.api.servlets.HttpConstants;
> import org.apache.sling.testing.mock.sling.ResourceResolverType;
> import org.apache.sling.testing.mock.sling.junit.SlingContext;
> import org.junit.Before;
> import org.junit.Rule;
> import org.junit.Test;
> import org.junit.runner.RunWith;
> import org.mockito.Mock;
> import org.mockito.junit.MockitoJUnitRunner;
> import javax.servlet.ServletException;
> import java.io.IOException;
> import java.util.HashMap;
> import java.util.Map;
> import static org.junit.Assert.assertEquals;
> @RunWith(MockitoJUnitRunner.class)
> public class SimpleServletTest {
> @Rule
> public final SlingContext slingContext = new
> SlingContext(ResourceResolverType.RESOURCERESOLVER_MOCK);
> @Mock
> QueryBuilder queryBuilder;
> SimpleServlet simpleServlet;
> @Before
> public void setup() {
> slingContext.request().setMethod(HttpConstants.METHOD_GET);
> slingContext.requestPathInfo().setExtension("json");
> Map<Object, Object> config = new HashMap<Object, Object>();
> config.put("queryBuilder", queryBuilder);
> slingContext.registerInjectActivateService(new SimpleServletTest(),
> config);
> simpleServlet = slingContext.getService(SimpleServlet.class);
> }
> @Test
> public void testSampleServletRequest() throws IOException,
> ServletException {
> simpleServlet.doGet(slingContext.request(),slingContext.response());
> assertEquals(302,slingContext.response().getStatus());
> }
> }
> {code}
> After a run, i'm getting the following error:
> org.apache.sling.testing.mock.osgi.NoScrMetadataException: No OSGi SCR
> metadata found for class aa.core.servlets.SimpleServletTest
> at
> org.apache.sling.testing.mock.osgi.OsgiServiceUtil.injectServices(OsgiServiceUtil.java:381)
> at
> org.apache.sling.testing.mock.osgi.MockOsgi.injectServices(MockOsgi.java:148)
> at
> org.apache.sling.testing.mock.osgi.context.OsgiContextImpl.registerInjectActivateService(OsgiContextImpl.java:153)
> at
> org.apache.sling.testing.mock.osgi.context.OsgiContextImpl.registerInjectActivateService(OsgiContextImpl.java:168)
> at aa.core.servlets.SimpleServletTest.setup(SimpleServletTest.java:42)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:498)
> at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
> at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
> at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
> at
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
> at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
> at org.junit.rules.RunRules.evaluate(RunRules.java:20)
> at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
> at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
> at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
> at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
> at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
> at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
> at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
> at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
> at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
> at
> org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:68)
> at
> org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:74)
> at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
> at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:161)
> at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
> at
> com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
> at
> com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
> at
> com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
> at
> com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
> I'm using OSGI declarative service annotation:
> osgi.core: 6.0.0
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)