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());
    }
}