我正在为服务类的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);