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(一起运行,因为我正在模拟静态内容。

签名Object...作为最后一个参数,因此您必须使用 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()也可以避免歧义方法错误。

我在为同样的问题而苦苦挣扎。这是一个对我有用的模拟。

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

请注意,我使用 varargs 作为 anyString((。

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

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;
        }
    };
}

相关内容

  • 没有找到相关文章

最新更新