【发布时间】:2015-07-26 06:50:52
【问题描述】:
我正在 Spring Boot Java 应用程序中为服务类构建单元测试。
服务类对返回 JSON 响应的 REST API 服务进行外部调用。我正在使用 Mockito 模拟这个电话。我在 mockserver 响应中对 JSON 进行硬编码。
在单元测试中硬编码 JSON 是一种不好的做法吗?如果 JSON 结构发生变化,那么测试应该失败是我的推理。是否有更好的最佳实践来执行此操作?
以下示例代码段:
实际的代码是功能性的,我只是编辑了这个 sn-p 它为简洁起见,所以如果您发现任何错误,请发表评论:
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());
}
}
【问题讨论】:
-
JUnit 告诉我设置方法必须是静态的。 withSuccess() 方法定义在哪里?
-
问题 - 您的 classUnderTest 是否公开 /Users/ API 或者它是否从外部服务调用外部 REST 端点 (/Users/)?
标签: java spring unit-testing junit mockito