Пустой метод в сервисе не является насмешкой в ​​интеграционном тестировании - PullRequest
0 голосов
/ 17 марта 2020

В моем весеннем загрузочном проекте один из моих Сервисов зависит от внешнего сервиса, такого как Amazon. Я пишу интеграционное тестирование классов Controller. Итак, я хочу смоделировать метод в классе AmazonService (поскольку это зависит от стороннего API). Метод недействителен с одним аргументом Long и может выдавать пользовательские спецификации приложения c исключения.

Метод выглядит следующим образом: -

class AmazonService{
public void deleteMultipleObjects(Long enterpriseId) {
        String key = formApplicationLogokey(enterpriseId,null);
        List<S3ObjectSummary> objects = getAllObjectSummaryByFolder(key);
        List<DeleteObjectsRequest.KeyVersion> keys = new ArrayList<>();
        objects.stream().forEach(object->keys.add(new DeleteObjectsRequest.KeyVersion(object.getKey())));
        try{
            DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(this.bucket).withKeys(keys);
            this.s3client.deleteObjects(deleteObjectsRequest);
            log.debug("All the Application logos deleted from AWS for the Enterprise id: {}",enterpriseId);
        }
        catch(AmazonServiceException e){
            throw new AppScoreException(AppScoreErrorCode.OBJECT_NOT_DELETED_FROM_AWS);
        }
    }}

Класс теста

class Test
    {
        @Autowired
        AmazonServiceImpl amazonService;

        @Autowired
        EnterpriseService enterpriseService;

        @Before
        public void init()
        {
            amazonService = Mockito.mock(AmazonServiceImpl.class);        
            Mockito.doNothing().when(amazonService).deleteMultipleObjects(isA(Long.class));
        }


        @Test
        public void testDeleteEnterprise(){
            setHeaders();
            EnterpriseDTO enterpriseDTO = createEnterpriseEntity(null,"testDeleteEnterpriseName3",null,null,null);
            String postUrl = TestUrlUtil.createURLWithPort(TestConstants.ADD_ENTERPRISE,port);
            HttpEntity<EnterpriseDTO> request1 = new HttpEntity<>(enterpriseDTO,headers);
            ResponseEntity<EnterpriseDTO> response1 = restTemplate.postForEntity(postUrl,request1,EnterpriseDTO.class);
            assert response1 != null;
            Long enterpriseId = Objects.requireNonNull(response1.getBody()).getId();
            String url = TestUrlUtil.createURLWithPort(TestConstants.DELETE_ENTERPRISE,port)+File.separator+enterpriseId;
            HttpEntity<EnterpriseDTO> request = new HttpEntity<>(null, headers);
            ResponseEntity<Object> response = restTemplate.exchange(url,HttpMethod.DELETE,request,Object.class);
            Assert.assertEquals(Constants.ENTERPRISE_DELETION_SUCCESS_MESSAGE,response.getBody());
        }
    }

Класс EnterpriseResource

class EnterpriseResource
{
    @DeleteMapping("/enterprises/{enterpriseId}")
    public ResponseEntity<Object> deleteEnterprise(@PathVariable Long enterpriseId) {
        log.debug("REST request to delete Enterprise : {}", enterpriseId);
        enterpriseService.delete(enterpriseId);
        return ResponseEntity.badRequest().body(Constants.ENTERPRISE_DELETION_SUCCESS_MESSAGE);
    }
}

Класс EnterpriseServiceImpl

class EnterpriseServiceImpl
{
    @Override
    public void delete(Long enterpriseId) {
        log.debug("Request to delete Enterprise : {}", enterpriseId);
        enterpriseRepository.deleteById(enterpriseId);
        amazonService.deleteMultipleObjects(enterpriseId);
    }
} 

Я пробовал различные подходы к Mock этому методу, но он не работал, и во время отладки внутри этого метода происходит контроль. Я хочу ничего не делать в этом методе во время тестирования. Я пробовал различные подходы, такие как throw (), doNothing (), spy () и т.д. c.

Пожалуйста, помогите, что здесь не хватает?

Спасибо

...