我正在尝试为通用服务类编写单元测试,如下所示:
public class ApiService{
private RestTemplate restTemplate;
private ServiceDao serviceDao;
@Autowired
public ApiService(RestTemplate restTemplate, ServiceDao serviceDao) {
this.restTemplate = restTemplate;
this.serviceDao = serviceDao;
}
public ResponseEntity getObject(ObjectRequest request) {
// Service logic here
}
public ResponseEntity postObject(CreateObjectRequest request) {
// Service logic here
}
}
但是在如何在我的服务类的构造函数中模拟restTemplate时很费劲,以便在测试运行时不会持久保存数据。.尽管没有看到很多有关Mockito +的示例或文档,但我一直在研究Mockito。在这种情况下是TestNG。任何帮助将不胜感激
答案 0 :(得分:0)
首先-如果可能,在您的服务中注入RestOperations而不是RestTemplate。然后,您将可以轻松模拟其行为(注意:RestTemplate实现RestOperations)。
如果无法使用RestOperations-您可以执行以下操作:
RestTemplate myTemplate = Mockito.spy(new RestTemplate());
String expectedOutput = "hello mock";
String inputUrl = "https://stackoverflow.com/questions/53872148/unit-test-service-class-with-mocks-using-testng";
Mockito.doReturn(expectedOutput).when(myTemplate).getForObject(inputUrl, String.class);
String result = myTemplate.getForObject(inputUrl, String.class);
Assert.assertEquals(expectedOutput, result);
答案 1 :(得分:0)
我实际上已经使用Mockito构造了一种方法,如下所示……可能会有一个更优雅的解决方案,所以我很想看看:
public class ServiceTest {
@BeforeMethod(groups="serviceTest")
public void beforeMethod() {
MockitoAnnotations.initMocks(this);
}
@Test(groups="serviceTest")
public void testGetService_returns200() {
when(serviceDao.getService(any(String.class), any(RestTemplate.class), any(HttpHeaders.class))).thenReturn(new ResponseEntity(new Object(), HttpStatus.OK));
ObjectRequest request = new ObjectRequest();
// set request values
ResponseEntity testResponse = apiService.getObject(request);
}
}