使用TestNG

时间:2018-12-20 16:03:23

标签: java unit-testing spring-boot testng

我正在尝试为通用服务类编写单元测试,如下所示:

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。任何帮助将不胜感激

2 个答案:

答案 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);

    }
}