有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java单元测试服务类,带有使用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) 个答案

  1. # 1 楼答案

    我已经用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);
    
        }
    }
    
  2. # 2 楼答案

    首先——如果可能的话,在服务中注入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);