Тип возврата макетного метода в java - PullRequest
0 голосов
/ 05 августа 2020

Ниже приведен основной код, состоящий из одного класса утилиты и класса обслуживания, использующего его

@PropertySource("classpath:atlas-application.properties")
public class ApacheAtlasUtils {

  @Value("${atlas.rest.address}")
  private String atlasURL;
  
  @Value("${atlas.rest.user}")
  private String atlasUsername;

  @Value("${atlas.rest.password}")
  private String atlasPassword;

  private AtlasClientV2 client;

  public AtlasClientV2 createClient() {
    if (client == null) {
      return new AtlasClientV2(new String[] {atlasURL}, new String[] {atlasUsername, atlasPassword});
    } else {
      return client;
    }
  }
}

Класс обслуживания ниже: -

@Override
  public Page<SearchResultDto> findFilesWithPages(QueryParent queryParent, Pageable pageable)
    throws AtlasServiceException {
    //  Some code
    client = new ApacheAtlasUtils().createClient();
   //some code
      
      }

  

Я пишу модульный тест для метода обслуживания и Я получаю исключение для метода createClient, запрашивающего значения для URL-адреса, имени пользователя и пароля, чего не должно происходить, поскольку это должно быть издевательским, но издевательство дает мне ошибку ниже

java.lang.IllegalArgumentException: Base URL cannot be null or empty.

    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:141)
    at org.apache.atlas.AtlasServerEnsemble.<init>(AtlasServerEnsemble.java:35)
    at org.apache.atlas.AtlasBaseClient.determineActiveServiceURL(AtlasBaseClient.java:318)
    at org.apache.atlas.AtlasBaseClient.initializeState(AtlasBaseClient.java:460)
    at org.apache.atlas.AtlasBaseClient.initializeState(AtlasBaseClient.java:448)
    at org.apache.atlas.AtlasBaseClient.<init>(AtlasBaseClient.java:132)
    at org.apache.atlas.AtlasClientV2.<init>(AtlasClientV2.java:82)
    at com.jlr.stratus.commons.utils.ApacheAtlasUtils.createClient(ApacheAtlasUtils.java:40)
    at com.jlr.stratus.rest.service.impl.FileSearchService.findFilesWithPages(FileSearchService.java:49)

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

 private FileSearchService fileSearchService;

  @Spy
  private ApacheAtlasUtils apacheAtlasUtils;

  @Mock
  private AtlasClientV2 client;

  @Before
  public void setup() {
    MockitoAnnotations.initMocks(this);
    fileSearchService = new FileSearchService();
  }
  
@Test
  public void findFilesWithPages_searchAll() throws AtlasServiceException {
        Mockito.doReturn(client).when(apacheAtlasUtils).createClient();

   service.search(queryParent,pageable);

  } 
      

  
  
  

1 Ответ

0 голосов
/ 05 августа 2020

Ваша идея со шпионажем адекватна (вы можете даже go для издевательства, если вам на самом деле не нужна настоящая реализация этого класса).

Проблема заключается в реализации:

    //  Some code
    client = new ApacheAtlasUtils().createClient();
   //some code
      
      }

Вместо использования ApacheAtlasUtils в качестве переменной экземпляра (или метода поставщика) вы создаете экземпляр на лету.

Mockito недостаточно умен, чтобы отловить эту операцию и заменить реальный объект на вы шпион.

Используя метод поставщика, вы можете настроить свой тест следующим образом:

  @Spy
  private FileSearchService fileSearchService = new FileSearchService();

  @Spy
  private ApacheAtlasUtils apacheAtlasUtils = new ApacheAtlasUtils();

  @Mock
  private AtlasClientV2 client;

  @Before
  public void setup() {
    MockitoAnnotations.initMocks(this);

    doReturn(apacheAtlasUtils).when(fileSearchService).getApacheUtils();
  }

в вашем SUT:

@Override
  public Page<SearchResultDto> findFilesWithPages(QueryParent queryParent, Pageable pageable)
    throws AtlasServiceException {
    //  Some code
    client = getApacheUtils().createClient();
   //some code
      
      }

ApacheAtlasUtils getApacheUtils(){
   return new ApacheAtlasUtils();
}
...