You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 09:24:04