AEM项目JUnit测试出现java.lang.NullPointerException问题排查
问题根因
adaptTo()返回null直接触发NPE,是几个AEM单元测试的常见问题叠加导致的:
- 类与资源类型映射完全不匹配:你JSON里配置的节点
sling:resourceType是project/components/core/title,但你注册到上下文的模型只有TestImpl.class,甚至测试方法里还出现了适配Title.class的代码,Sling模型适配机制找不到和当前资源类型、适配目标类绑定的实现类,直接返回null。 - Mock的服务未生效:你用@Mock生成的
ModelFactory实例没有注册到AemContext的内置OSGi容器中,上下文适配模型时调用的是容器内部自带的服务实例,你写的mock打桩逻辑根本不会触发。 - 模型适配源配置不匹配:如果你的
TestImpl类上的@Model注解没有指定adaptables = SlingHttpServletRequest.class,默认不支持从request对象适配,只能从Resource对象适配,调用request.adaptTo()自然返回null。 - JSON结构不完整:你贴的JSON文件最外层缺失根节点大括号,会导致JSON加载后
/content/text节点未正确初始化,currentResource()指向的路径不存在时适配也会返回null。
修复方案
按以下顺序调整代码即可解决:
- 统一模型、资源类型、适配类的对应关系
首先给TestImpl加上正确的模型注解,确保和组件资源类型绑定:
同时修正测试JSON里的资源类型配置,补全JSON结构:@Model( adaptables = SlingHttpServletRequest.class, // 声明支持从request适配 adapters = Test.class, // 声明适配的目标接口 resourceType = "project/components/core/test" // 和组件sling:resourceType保持一致 ) public class TestImpl implements Test { @ValueMapValue private String text; @Override public String getText() { return text; } }{ "text": { "jcr:primaryType": "nt:unstructured", "sling:resourceType": "project/components/core/test", "text": "textTEST" } } - 清理无效Mock代码
如果你的TestImpl内部没有主动注入ModelFactory做嵌套模型调用,直接删掉所有ModelFactory相关的@Mock和打桩代码即可——AemContext自带的测试版ModelFactory会自动完成模型适配,不需要额外Mock。如果确实需要Mock ModelFactory,在setUp方法里加一行把Mock实例注册到上下文容器:ctx.registerService(ModelFactory.class, modelFactory); - 修正测试方法逻辑
不要跨类适配,确保适配的目标类和你注册的模型一致,同时增加非空断言方便排查问题:
如果你的模型设计为仅支持从Resource适配,把适配代码改成@Test void testGetText() { final String expected = "textTEST"; ctx.currentResource("/content/text"); // 确认资源加载正确 assertEquals("/content/text", ctx.currentResource().getPath()); Test test = ctx.request().adaptTo(Test.class); // 提前做非空校验,避免直接抛NPE找不到根因 assertNotNull(test); String actual = test.getText(); assertEquals(expected, actual); }Test test = ctx.currentResource().adaptTo(Test.class)即可,同时把@Model注解里的adaptables参数改为Resource.class。
排错提示:AEM Sling模型适配失败时不会主动抛明确异常,只会返回null,遇到这类问题优先按「资源路径是否存在→资源类型是否和模型绑定→适配源是否在@Model注解中声明→模型类是否注册到AemContext」的顺序排查即可。
内容的提问来源于stack exchange,提问作者Hyb90
相关产品推荐
相关产品推荐

