如何在Sling Model中Mock @RequestAttribute标注的属性值
问题根因
你之前的两个方案都踩了Sling Model注入的规则误区:
- 第一个方案:你传入的是字符串类型的
"true",但Sling Model的@RequestAttribute注入要求属性类型和字段类型匹配,你定义的字段是boolean基本类型,字符串值无法匹配注入,就会走默认值false - 第二个方案:
@RequestAttribute注入读取的是SlingHttpServletRequest#setAttribute存储的请求域属性,你Mock的是getRequestParameter(对应HTTP请求参数,比如URL参数、表单参数),两者完全不是同一个数据源,自然不会生效
正确实现方案
方案1:使用Sling Mock测试
直接存入对应类型的boolean值即可:
// register adapter factory BundleContext bundleContext = MockOsgi.newBundleContext(); MockSling.setAdapterManagerBundleContext(bundleContext); // prepare sling request ResourceResolver resourceResolver = MockSling.newResourceResolver(bundleContext); MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(resourceResolver); // 直接存入boolean类型,不要用字符串 request.setAttribute("isRegistration", true); // 适配获取Sling Model即可正常注入 YourModel model = request.adaptTo(YourModel.class);
如果测试未生效,额外确保你测试类加了Sling Mock的注解配置,启用了RequestAttribute注入支持:
@ExtendWith(SlingContextExtension.class) @SlingContextOptions(scripting = {}) public class YourModelTest { // 测试逻辑 }
方案2:使用Mockito纯Mock测试
直接MockgetAttribute方法即可,不要操作RequestParameter:
@Mock SlingHttpServletRequest slingHttpServletRequest; // 直接Mock getAttribute返回对应boolean值 Mockito.when(slingHttpServletRequest.getAttribute("isRegistration")).thenReturn(true);
内容的提问来源于stack exchange,提问作者raju muddana
相关产品推荐
相关产品推荐

