TransWikia.com

Mock variável local dentro de método com mockito e spring boot

Stack Overflow em Português Asked by Samuel Oliveira Chaves on December 17, 2020

Estou tentando simular o retorno de um método em uma variável local, mas é sempre nulo, mostrando java.lang.NullPointerException

Eu tenho o seguinte código dentro de um @service:

@Service
@AllArgsConstructor
public class VideoEncodingService {
  private final MainService mainService;
  @Value("${bucket.videos.aws.s3}")
  private String bucketS3;

  @Value("${accessKey.acess.bucket}")
  private String accessKeyS3;

  @Value("${secretKey.acess.bucket}")
  private String secretKeyS3;

  @Value("${bit.movin.url.api.output.s3}")
  private String urlEndpointOutputS3;

public void createOutputS3(Config cf) {
    // encoding/outputs/s3
    OutputS3DTO os3 = mainService.returnObject(urlEndpointOutputS3,
        new OutputS3DTO(bucketS3, accessKeyS3, secretKeyS3), new TypeReference<OutputS3DTO>() {});
    cf.setIdOutputS3(os3.getId());
  }
}
@Service
@AllArgsConstructor
public class MainService {

  private final RestTemplate restTemplate;


  private final ObjectMapper mapper;

  @Value("${bit.movin.url}")
  private String urlBaseBitMovin;

  @Value("${bit.movin.api.key}")
  private String apiKey;

  protected <T> String post(String urlApi, T object) {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.set("X-Api-Key", apiKey);
    HttpEntity<?> request = new HttpEntity<>(getJSON(object), headers);
    return restTemplate.postForObject(urlBaseBitMovin + urlApi, request, String.class);
  }

  private <T> String getJSON(T instance) throws RuntimeException {
    try {
      return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(instance);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

  @SuppressWarnings("unchecked")
  public <T> T returnObject(String endpoint, T instance, TypeReference<T> typeReference)
      throws RuntimeException {
    try {
      String jsonResult = post(endpoint, instance);
      JSONObject jSONObject = new JSONObject(jsonResult);
      JSONObject resultObject;
      resultObject =
          jSONObject.getJSONObject(KEY_DATA_BIT_MOVIN).getJSONObject(KEY_RESULT_BIT_MOVIN);
      if (resultObject != null) {
        return (T) mapper.readValue(resultObject.toString(), instance.getClass());
      }
    } catch (Exception e) {
      throw new RuntimeException(e.toString());
    }
  }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OutputS3DTO{
  /**
   * 
   */
  private static final long serialVersionUID = 1L;

  private String id;
  private String name = "S3 storage config";
  private String bucketName;
  private String accessKey;
  private String secretKey;

  public OutputS3DTO(String id) {
    this.id = id;
  }
}

Estou testando com mockito assim:

package br.com.video;

@RunWith(MockitoJUnitRunner.class)
public class EncodingVideoTestApplicationTests {

  @InjectMocks
  private VideoEncodingService videoEncodingService;

  @Mock
  private MainService mainService;


  @Test
  public void createOutputS3() {
    videoEncodingService = new VideoEncodingService(mainService);
    OutputS3DTO s3 = new OutputS3DTO("1");
    Config config = new Config();
    Mockito.when(mainService.returnObject(Mockito.anyString(), Mockito.any(), Mockito.any()))
        .thenReturn(s3);
    videoEncodingService.createOutputS3(config);
    assertEquals(config.getIdOutputS3(), "1");
  }

}

Nesse linha:

cf.setIdOutputS3(os3.getId());

os3 sempre é nulo

One Answer

Fala Samuel. Acredito que sua chamada pro createOutputS3 dentro do teste, esteja instanciando a classe VideoEncodingService com valores nulos nas propriedades.

Com isso, quando você usa Mockito.anyString(), ele vai esperar uma string pra entender que aquela chamada deve ser mockada, mas como está vindo nulo em "urlEndpointOutputS3", o mock não acontece.

Tenta debugar pra ver se isso realmente está acontecendo, e se for isso, muda o anyString pra "any". Se o any não aceitar null, coloca todos os parametros do seu mock como "null" em vez de "any"

Answered by Danilo Rodrigues on December 17, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP