Mockito不适用于RestTemplate

时间:2017-05-22 04:59:49

标签: java mockito resttemplate

我正在使用mockito来模拟RestTemplate交换调用。以下是我使用过的,但它并没有拿起模拟的RestTemplate。

嘲笑电话。

ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class, userId);

模拟的RestTempate如下。

Mockito.when(restTemplate.exchange(
            Matchers.anyString(),
            Matchers.any(HttpMethod.class),
            Matchers.<HttpEntity<?>> any(),
            Matchers.<Class<String>> any(),
            Matchers.anyString())).
            thenReturn(responseEntity);

知道这里出了什么问题吗?这与@RunWith(PowerMockRunner.class)一起运行,因为我在嘲笑静态内容。

3 个答案:

答案 0 :(得分:3)

signatureObject...作为最后一个参数,因此您必须使用anyVarArg()。这在这里工作正常:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(MockitoJUnitRunner.class)
public class Foo {
    @Mock
    private RestTemplate restTemplate;

    @Test
    public void testXXX() throws Exception {
        Mockito.when(this.restTemplate.exchange(Matchers.anyString(), Matchers.any(HttpMethod.class), Matchers.any(), Matchers.<Class<String>>any(), Matchers.<Object>anyVararg()))
               .thenReturn(ResponseEntity.ok("foo"));

        final Bar bar = new Bar(this.restTemplate);
        assertThat(bar.foobar()).isEqualTo("foo");
    }

    class Bar {
        private final RestTemplate restTemplate;

        Bar(final RestTemplate restTemplate) {
            this.restTemplate = restTemplate;
        }

        public String foobar() {
            final ResponseEntity<String> exchange = this.restTemplate.exchange("ffi", HttpMethod.GET, HttpEntity.EMPTY, String.class, 1, 2, 3);
            return exchange.getBody();
        }
    }
}

注意:使用anyVarArg,强制转换(Object) Matches.anyVarArgs()也可以避免模糊方法错误。

答案 1 :(得分:0)

因为我在我的方法中执行以下操作。模拟的交换方法没有约束力。

RestTempate restTempalte = new RestTemplate();

所以我将源代码更改为以下内容,并创建一个方法来创建RestTempate实例。

public RestTemplate createRestTemplate() {
    return new RestTemplate();
}

在测试源中做了以下工作。

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

    sampleClient = new SampleClient() { 
        @Override
        public RestTemplate createRestTemplate() {
            return restTemplate;
        }
    };
}

答案 2 :(得分:0)

我也遇到了同样的问题。这是一个对我有用的模拟。

 when(this.restTemplate.exchange(anyString(),
            any(),
            any(),
            eq(String.class),
            anyString()))
            .thenReturn(new ResponseEntity<>(subscriptionDataJson,
                    HttpStatus.OK));

请注意,我将可变参数用作 anyString()。