我有一个我正在尝试测试的Rest Service Client。 这是我试图测试的客户端方法:
public RestPriceRow getPriceRow(String customer, String product, String qt)
throws Exception {
// Prepare acceptable media type
List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
acceptableMediaTypes.add(MediaType.APPLICATION_XML);
// Prepare header
HttpHeaders headers = new HttpHeaders();
headers.setAccept(acceptableMediaTypes);
HttpEntity<PriceRowDto> entity = new HttpEntity<PriceRowDto>(headers);
// Prepare response
RestPriceRow res = new RestPriceRow();
// Send the request as GET
try {
ResponseEntity<PriceRowDto> result =
restTemplate.exchange(baseURL + "{customerId}/{productId}/{quantity}",
HttpMethod.GET, entity, PriceRowDto.class, customer,product,qt);
PriceRowDto response = result.getBody();
return response;
} catch (Exception e) {
e.printStackTrace();
}
}
这是我的测试课程:
@Before
public void setUp() {
RestTemplate r = mock(RestTemplate.class);
restPriceService = new RestPriceServiceImpl();
restPriceService.setRestTemplate(r);
restPriceService.setBaseURL("url");
}
@Test
public void prueba() {
PriceRowDto r = new PriceRowDto("100","200","9","10","0","19/11/2012");
try {
when(restPriceService.getPriceRow("100","200","16")).thenReturn(r);
} catch (Exception e) {
e.printStackTrace();
}
}
我的问题是,当我运行此测试时,它会在执行NullPointerException
时向我抛出result.getBody()
。 (结果为空)
答案 0 :(得分:4)
您将SUT(受测系统)与模拟的协作者混合在一起。 SUT是你测试的方法。协作者根据需要播放并返回数据,以便SUT工作。
RestPriceService
sut
实例: TODO restTemplate
:确定 restTemplateMock
一样突出: TODO sut
:确定 when(restTemplateMock.exchange(...).thenReturn(r)
: TODO sut.getPriceRow
: TODO RestPriceRow
是否正确: TODO restTemplateMock
: TODO 修改强>
如果您想阅读关于不同形式的单元测试的非常好书,我可以推荐XUnit Test Patterns。
答案 1 :(得分:0)
所以这里有两个问题。如果您想测试REST接口,即进行调用并查看结果并检查,我建议使用Jersey测试框架。它在测试服务器上运行,可以节省大量的工作。 (假设你正在使用泽西岛。)
http://jersey.java.net/nonav/documentation/latest/test-framework.html
但是如果你只想测试服务层,你可以编写正常的junit测试。