带远程呼叫的TDD测试弹簧服务

时间:2017-06-03 18:31:00

标签: java spring mockito resttemplate mockrestserviceserver

我会测试一个对另一台服务器进行远程调用的服务方法。此远程呼叫由restTemplate进行。

这是我的代码的一部分

    .....
    @Mock
    private RestTemplate restTemplate;

    private MockRestServiceServer server;

    private static String enpointSMS = "http://46.252.156.83:8454/sms";


    @Before
    public void setup() throws Exception {

         .....
        MockitoAnnotations.initMocks(this);

        ReflectionTestUtils.setField(campaignService, "sendSmsEndpointUrl", enpointSMS);

        server = MockRestServiceServer.createServer(restTemplate);
        .....
    }


     @Test
     public void myTest(){
      ......
        server.expect(requestTo(enpointSMS))
            .andExpect(method(POST))
            .andRespond(withSuccess("resultSuccess", MediaType.TEXT_PLAIN));

     ......
        verify(mock, times(1)).method1(any(Foo.class));
        verify(mock, times(1)).method2(any(Foo.class));
        server.verify();

     }

所有用于验证mockito但server.verify()给我一个错误

java.lang.AssertionError: Further request(s) expected leaving 1 unsatisfied expectation(s). 0 request(s) executed.

我无法理解原因,也许我无法使用它来模拟远程通话?如果我删除服务器(MockRestServiceServer)的期望,一切正常。

对此有何建议?

1 个答案:

答案 0 :(得分:1)

您必须在服务和测试代码之间共享相同的 RestTemplate对象。 否则,MockRestServiceServer将不会收到http请求。 标准解决方案是在服务和测试代码中添加RestTemplate bean注入它。

@Autowired
private RestTemplate restTemplate;

private MockRestServiceServer server;
//...