如何为Resttemplate交换方法编写mockito junit

时间:2015-06-15 06:23:00

标签: spring junit mockito resttemplate

如何为以下方法编写mockito junit:

@Autowired
RestTemplate restTemplate;

ResponseEntity<?> execute(final String url, HttpMethod httpMethod,
                          HttpEntity<?> entityRequest,
                          String.class, 
                          Map<String, String> urlVariables){
    restTemplate.exchange(url, httpMethod, entityRequest, responseType, urlVariables);
}

请帮我怎么写。

4 个答案:

答案 0 :(得分:17)

@RunWith(MockitoJUnitRunner.class)
public class ToTestTest {

  @InjectMocks
  private YourClass toTest;

  @Mock
  private RestTemplate template;

  @Test
  public void test() {
    toTest.execute(Mockito.anyString(), Mockito.any(), Mockito.any(), 
                   Mockito.any(), Mockito.any());

    Mockito.verify(template, Mockito.times(1))
                    .exchange(Mockito.anyString(),
                                    Mockito.<HttpMethod> any(),
                                    Mockito.<HttpEntity<?>> any(),
                                    Mockito.<Class<?>> any(),
                                    Mockito.<String, String> anyMap());
    }
 }

答案 1 :(得分:3)

我认为在这种情况下最方便和最合适的方法(使用RestTemplate进行客户端REST测试)将由MockRestServiceServer框架提供Spring Testing

答案 2 :(得分:0)

这取决于你想要什么。

使用模拟的一种方法是更容易调用execute方法。为此,您可以使用实际参数的模拟版本,例如HttpMethodHttpEntity。如果基础exchange方法需要这些参数中的某些行为,您可能需要使用mockito的when ... thenReturn方法将其存入。

设置这些模拟参数后,您可以调用execute方法,您需要检查其结果是否正确。

要检查返回的值,可以使用传统的JUnit断言。

此外,您可能希望检查实际发生的模拟对象的某些交互。为此,您可以使用mockito的verify方法来检查,例如,实际调用了一些HttpEntity方法。

从技术上讲,您还可以验证是否调用了其余模板的exchange方法。为此,您需要模拟RestTemplate并在您测试的类中注入模拟。然后,您可以使用mockito&#39; verfiy检查exchange是否以正确的方式调用。这通常是明智之举,特别是如果有更多方法可以在您的被测试阶段进行测试。对于目前的execute方法,它看起来有点矫枉过正。

答案 3 :(得分:0)

我曾经遇到过这样的错误。我找到了更可靠的解决方案。我也提到了对我有用的导入声明。下面的代码完美地模拟了其余模板。

import org.mockito.Matchers;  
import static org.mockito.Matchers.any;

    HttpHeaders headers = new Headers();
    headers.setExpires(10000L);     
    ResponseEntity<String> responseEntity = new ResponseEntity<>("dummyString", headers, HttpStatus.OK);
    when(restTemplate.exchange( Matchers.anyString(), 
            Matchers.any(HttpMethod.class),
            Matchers.<HttpEntity<?>> any(), 
            Matchers.<Class<String>> any())).thenReturn(responseEntity);

这里'responseEntity'值不会为空,我们可以使用它来完美地声明一条语句。