@RefreshScope似乎忽略了Mockito的模拟

阿敏·阿布·塔莱布(Amin Abu-Taleb)

我正在使用Spring Boot和Spring Cloud Config服务实现服务以提供配置值。在我的服务中,我有几个配置值,当远程Git存储库中的值更改时,这些配置值需要刷新,而我一直@RefreshScope在启用该功能。

当我尝试RestTemplate在该服务中插入模拟程序时,问题就来了,它似乎忽略了它并改用了自动装配实例。如果我注释掉注释,它似乎可以正常工作。

这是该服务的代码:

@Service
@RefreshScope
public class MyServiceImpl implements MyService {

    private static final Logger LOG = Logger.getLogger(MyServiceImpl.class);

    @Autowired
    public RestTemplate restTemplate;

    @Value("${opts.default}")
    private String default;

    @Value("${opts.address}")
    private String address;

    @Value("${opts.separator}")
    private String separator;

    ...


  }

测试源代码:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class ServiceTest {

    @Mock
    private RestTemplate restTemplate;

    @Autowired
    @InjectMocks
    private MyServiceImpl service;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    public void testMethod() throws Exception {
        when(restTemplate.postForObject(anyString(), any(), eq(ServiceResponse.class), anyMap())).thenReturn(getSuccessfulResponse());

        ServiceResponse response = service.doYourStuff();

        Assert.assertNotNull(response);
        Assert.assertTrue(response.isSuccessful());
    }

    ...
  }
然后马库斯

当添加@RefreshScopebean时,它将成为代理而不是实际的原始实现。当前,RestTemplate是在代理而不是基础实例上设置的。(如果您进行调试,则会看到您MyServiceImpl实际上更像是的实例MyServiceImpl$SpringCgLib#353234)。

要解决此问题,您需要使用ReflectionTestUtils手动设置依赖项AopTestUtils后者是获取实际的代理。

初始化模拟后,删除@InjectMocks注释并在您的setup方法中添加以下内容

Object actualTarget = AopTestUtils.getUltimateTargetObject(service);
ReflectionTestUtils.setfield(actualTarget, "restTemplate", restTemplate);

对于早于4.2的版本,以下方法可以解决问题

Object actualTarget = (service instanceof Advised) ? ((Advised) service).getTargetSource().getTarget() : service;

问题在于,Mockito不会检测到代理,而只是设置该字段。ReflectionTestUtils没有检测到代理或者因此手动解缠。实际上,我之前曾几次闯入该陷阱,这导致我今天早上创建了SPR-14050,将其嵌入ReflectionTestUtils到其中可以减轻一些痛苦。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用Mockito在Kotlin中模拟队列似乎不起作用

来自分类Dev

使用Mockito模拟方法时,可以忽略方法的某些方面吗?

来自分类Dev

.babelrc忽略字段似乎被忽略

来自分类Dev

NSURLSessionTaskPriority似乎被忽略了?

来自分类Dev

迭代似乎已被忽略?

来自分类Dev

.htaccess规则似乎被忽略

来自分类Dev

使用Mockito模拟枚举?

来自分类Dev

Mockito模拟的getClass

来自分类Dev

使用Mockito模拟AccountManager

来自分类Dev

了解模拟/存根-Mockito

来自分类Dev

使用Mockito模拟AccountManager

来自分类Dev

在Mockito中模拟DAO

来自分类Dev

模拟方法与 Mockito 无关

来自分类Dev

AffineTransform似乎忽略了组件边界

来自分类Dev

JSoup似乎忽略了字符代码?

来自分类Dev

ApiController路由似乎忽略了动作

来自分类Dev

JSoup似乎忽略了字符代码?

来自分类Dev

Xorg似乎忽略了键盘设置

来自分类Dev

使类成为Mockito模拟而不调用模拟

来自分类Dev

Mockito 在模拟创建中模拟创建

来自分类Dev

Android Mockito如何模拟资源

来自分类Dev

Mockito模拟类返回Null

来自分类Dev

Mockito无法模拟原始类型

来自分类Dev

用Mockito模拟静态方法

来自分类Dev

如何使用Mockito模拟For循环

来自分类Dev

模拟方法之外的Mockito存根

来自分类Dev

用Mockito模拟静态字段

来自分类Dev

无法使用Mockito模拟WebView

来自分类Dev

使用Mockito模拟HttpURLConnection的问题