使用Junit和Mockito进行外部REST API调用的单元测试



我正在为服务类的Spring Boot Java应用程序建立单元测试。

服务类对返回JSON响应的REST API服务进行外部调用。我正在使用Mockito嘲笑这个电话。我在模拟器响应中进行了硬编码。

在您的单位测试中进行硬编码的JSON是不好的做法吗?如果JSON结构发生变化,那么测试应该失败是我的推理。有更好,最好的做法吗?

示例片段下面:

实际代码是功能性的,我只是对此片段进行了编辑,以使其简单地介绍这个想法,因此,如果您看到任何错误,请发表评论:

    public class UserServiceTest extends TestCase {
    private static final String MOCK_URL = "baseUrl";
    private static final String DEFAULT_USER_ID = "353";
    UserService classUnderTest;
    ResponseEntity<Customer> mockResponseEntity;
    MockRestServiceServer mockServer;
    @Mock
    RestTemplate mockRestTemplate;
    public void setUp() throws Exception {
        super.setUp();
        classUnderTest = new UserRestService();
        mockRestTemplate = new RestTemplate();
        mockServer = MockRestServiceServer.createServer(mockRestTemplate);
        ReflectionTestUtils.setField(classUnderTest, "restTemplate",
                mockRestTemplate);
        ReflectionTestUtils.setField(classUnderTest, "userSvcUrl",
                MOCK_URL);
    }
    public void testGetUserById() throws Exception {
        mockServer.expect(requestTo(MOCK_URL + "/Users/" + DEFAULT_USER_ID)).andExpect(method(HttpMethod.GET))
                .andRespond(withSuccess(
                        "{n" +
                                "    "UserCredentials": {n" +
                                "        "Password": "",n" +
                                "        "PasswordNeedsUpdate": false,n" +
                                "        "Security": [n" +
                                "            {n" +
                                "                "Answer": "",n" +
                                "                "Question": "Why did the bicycle fall over?"n" +
                                "            }n" +
                                "        ]n" +
                                "}"
                        , MediaType.APPLICATION_JSON));

        Customer customer = classUnderTest.getUserById(DEFAULT_USER_ID);
        mockServer.verify();
        assertNotNull(customer);
        assertEquals(DEFAULT_USER_ID, customer.getId());
    }
}

我目前与您在同一条船上,我的理由如下:创建虚拟的JSON反应就像嘲笑对象并使用Mockito.when控制它。更改内部解析或期望不同的结果时,您需要更改when().thenReturn()调用中的任何内容。JSON响应是相同的,其中更改了调用并更改对象表示。

因此,我的猜测是很好。阅读有关测试REST API的各种文章,一般的共识是创建虚拟json-responses是一个很好的做法。最佳实践是(不时)下载真正的JSON-RESPONSE,并将其作为模拟响应插入。这样,您可以将测试与外部方保持最新状态,而测试可以在没有Internet请求的情况下进行。

按要求编辑:

  • Ruby-固执的外部服务,

  • python-测试成功的呼叫

  • JavaScript- AJAX测试的一个示例

  • python-最后是有关嘲笑

  • 的Google教程

我想对另一种考虑的方法发光,那就是创建JSON代表的对象的POJO(例如数据模型,Javbean),然后使用JSON Serialializer,像Google的Gson一样,将其转换为JSON字符串。

UserCredentials uc = new UserCredentials ();
//set the values
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(uc);

相关内容

  • 没有找到相关文章