Unit testing AEM模拟:无法注入配置

Unit testing AEM模拟:无法注入配置,unit-testing,aem,sling,Unit Testing,Aem,Sling,我正在使用测试使用配置的自定义servlet,例如: @激活 无效激活(最终配置){…} 我遵循所描述的方法注册并注入服务以及HashMap,如下所示: private静态映射myHashMap=newhashmap(); ... myHashMap.put(“a”、“b”); myHashMap.put(“c”、“d”); ... servlet=context.registerInjectActivateService(新的MyServlet(),myHashMap); 然而,这种方法不

我正在使用测试使用配置的自定义servlet,例如:

@激活
无效激活(最终配置){…}
我遵循所描述的方法注册并注入服务以及HashMap,如下所示:

private静态映射myHashMap=newhashmap();
...
myHashMap.put(“a”、“b”);
myHashMap.put(“c”、“d”);
...
servlet=context.registerInjectActivateService(新的MyServlet(),myHashMap);
然而,这种方法不起作用。上面传递的
activate
函数中的config对象已损坏。对于上面的每个键值对,它将
null
设置为值。因此,不是:

a->b
c->d
它规定:

a->null
c->null
在HashMap内部。有人能帮忙吗?谢谢


另外,我应该补充一点,我正在使用AEM Mocks的2.3.0版本,因为最近的版本会导致旧工件出现问题。有关这方面的更多信息,请参阅。

我对它进行了测试,它也适用于2.3.0版。你能检查一下下面的例子吗?在那之后,这可能是一个专业问题。那么我们需要更多的信息

以下是我的测试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());
    }
}
公共类TestServletTest{
@统治
公共最终AemContext context=新AemContext();
@试验
public void testwithout config(){
final TestServlet TestServlet=context.registerInjectActivateService(新的TestServlet());
assertEquals(“早上好,Alex”,testServlet.getGreeting());
}
@试验
public void testWithConfig(){
最终映射属性=新HashMap();
出售(“名称”、“伯恩特”);
属性。放置(“问候。早晨”,“保持睡眠”);
final TestServlet TestServlet=context.registerInjectActivateService(新的TestServlet(),属性);
assertEquals(“保持睡眠,Berndt”,testServlet.getGreeting());
}
}

我对它进行了测试,它也适用于2.3.0版。你能检查一下下面的例子吗?在那之后,这可能是一个专业问题。那么我们需要更多的信息

以下是我的测试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());
    }
}
公共类TestServletTest{
@统治
公共最终AemContext context=新AemContext();
@试验
public void testwithout config(){
final TestServlet TestServlet=context.registerInjectActivateService(新的TestServlet());
assertEquals(“早上好,Alex”,testServlet.getGreeting());
}
@试验
public void testWithConfig(){
最终映射属性=新HashMap();
出售(“名称”、“伯恩特”);
属性。放置(“问候。早晨”,“保持睡眠”);
final TestServlet TestServlet=context.registerInjectActivateService(新的TestServlet(),属性);
assertEquals(“保持睡眠,Berndt”,testServlet.getGreeting());
}
}

谢谢您的回答。我无法复制你在我这方面的结果,因此这可能确实是一个专业问题。我将进一步研究它——知道默认的做事方式确实有效是很有帮助的,在版本2.3.0中。请在问题中添加有效的pom.xml。也许我们可以研究一下(将
help:effective pom
添加到maven命令行)我不能添加它,因为它是私有代码,但是关于private的提示很有趣。我可能已将AemContext或配置设置为private。我会调查的。谢谢不,我指的是pom.xml中的服务器名称、电话号码或密码等私人信息。谢谢你的回答。我无法复制你在我这方面的结果,因此这可能确实是一个专业问题。我将进一步研究它——知道默认的做事方式确实有效是很有帮助的,在版本2.3.0中。请在问题中添加有效的pom.xml。也许我们可以研究一下(将
help:effective pom
添加到maven命令行)我不能添加它,因为它是私有代码,但是关于private的提示很有趣。我可能已将AemContext或配置设置为private。我会调查的。谢谢不,我指的是pom.xml中的服务器名称、电话号码或密码等私人信息。