AEM Mocks:无法注入配置
AEM Mocks: Cannot Inject Config
我正在使用 AEM Mocks 来测试使用配置的自定义 servlet,例如:
@Activate
void activate(final Config config) { ... }
我正在按照 here and here 描述的方法来注册服务并将其与 HashMap 一起注入,如下所示:
private static Map<String, Object> myHashMap = new HashMap<>();
...
myHashMap.put("a", "b");
myHashMap.put("c", "d");
...
servlet = context.registerInjectActivateService(new MyServlet(), myHashMap);
但是,这种方法行不通。上面在 activate
函数内部传递的配置对象已损坏。对于上面的每个键值对,它将 null
设置为值。所以而不是:
a -> b
c -> d
设置:
a -> null
c -> null
HashMap 内部。有人可以帮忙吗?谢谢!
P.S。我应该补充一点,我使用的是 AEM Mocks 2.3.0 版,因为最新版本会导致旧工件出现问题。有关详细信息,请参阅 here。
我测试过,它也适用于 2.3.0 版本。你能检查下面的例子吗?在那之后,这可能是一个maven问题。然后我们需要更多信息。
这是我的测试 servlet:
@Component(service = Servlet.class,
property = {
SLING_SERVLET_PATHS + "=/bin/servlet/test",
SLING_SERVLET_METHODS + "=GET",
SLING_SERVLET_EXTENSIONS + "=text"
})
@Designate(ocd = TestServlet.Config.class)
public class TestServlet extends SlingSafeMethodsServlet {
@ObjectClassDefinition
public @interface Config {
@AttributeDefinition(
name = "Name",
description = "Name used in the hello world text"
)
String name() default "Alex";
@AttributeDefinition(
name = "Greeting",
description = "Greeting - Morning, to demonstrate the dot-replacement"
)
String greeting_morning() default "Good Morning";
}
private Config config;
@Override
protected void doGet(@Nonnull SlingHttpServletRequest request, @Nonnull SlingHttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.getWriter().println(this.getGreeting());
}
public String getGreeting() {
return config.greeting_morning() + ", " + config.name();
}
@Activate
void activate(final Config config) {
this.config = config;
}
}
这是一个 JUnit 4 测试:
public class TestServletTest {
@Rule
public final AemContext context = new AemContext();
@Test
public void testWithoutConfig() {
final TestServlet testServlet = context.registerInjectActivateService(new TestServlet());
assertEquals("Good Morning, Alex", testServlet.getGreeting());
}
@Test
public void testWithConfig() {
final Map<String, Object> properties = new HashMap<>();
properties.put("name", "Berndt");
properties.put("greeting.morning", "Keep sleeping");
final TestServlet testServlet = context.registerInjectActivateService(new TestServlet(), properties);
assertEquals("Keep sleeping, Berndt", testServlet.getGreeting());
}
}
我正在使用 AEM Mocks 来测试使用配置的自定义 servlet,例如:
@Activate
void activate(final Config config) { ... }
我正在按照 here and here 描述的方法来注册服务并将其与 HashMap 一起注入,如下所示:
private static Map<String, Object> myHashMap = new HashMap<>();
...
myHashMap.put("a", "b");
myHashMap.put("c", "d");
...
servlet = context.registerInjectActivateService(new MyServlet(), myHashMap);
但是,这种方法行不通。上面在 activate
函数内部传递的配置对象已损坏。对于上面的每个键值对,它将 null
设置为值。所以而不是:
a -> b
c -> d
设置:
a -> null
c -> null
HashMap 内部。有人可以帮忙吗?谢谢!
P.S。我应该补充一点,我使用的是 AEM Mocks 2.3.0 版,因为最新版本会导致旧工件出现问题。有关详细信息,请参阅 here。
我测试过,它也适用于 2.3.0 版本。你能检查下面的例子吗?在那之后,这可能是一个maven问题。然后我们需要更多信息。
这是我的测试 servlet:
@Component(service = Servlet.class,
property = {
SLING_SERVLET_PATHS + "=/bin/servlet/test",
SLING_SERVLET_METHODS + "=GET",
SLING_SERVLET_EXTENSIONS + "=text"
})
@Designate(ocd = TestServlet.Config.class)
public class TestServlet extends SlingSafeMethodsServlet {
@ObjectClassDefinition
public @interface Config {
@AttributeDefinition(
name = "Name",
description = "Name used in the hello world text"
)
String name() default "Alex";
@AttributeDefinition(
name = "Greeting",
description = "Greeting - Morning, to demonstrate the dot-replacement"
)
String greeting_morning() default "Good Morning";
}
private Config config;
@Override
protected void doGet(@Nonnull SlingHttpServletRequest request, @Nonnull SlingHttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.getWriter().println(this.getGreeting());
}
public String getGreeting() {
return config.greeting_morning() + ", " + config.name();
}
@Activate
void activate(final Config config) {
this.config = config;
}
}
这是一个 JUnit 4 测试:
public class TestServletTest {
@Rule
public final AemContext context = new AemContext();
@Test
public void testWithoutConfig() {
final TestServlet testServlet = context.registerInjectActivateService(new TestServlet());
assertEquals("Good Morning, Alex", testServlet.getGreeting());
}
@Test
public void testWithConfig() {
final Map<String, Object> properties = new HashMap<>();
properties.put("name", "Berndt");
properties.put("greeting.morning", "Keep sleeping");
final TestServlet testServlet = context.registerInjectActivateService(new TestServlet(), properties);
assertEquals("Keep sleeping, Berndt", testServlet.getGreeting());
}
}