Тестирование RestTemplate в SpringBoot - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь проверить класс ниже, который является читателем Spring Batch.Мой тест возвращает ноль, когда response.getBody () вызывается из теста в тесте.

Мой класс Java:

@Value("${rest.basepath}")
private String apiURI;
private int nextEmailIndex;
private RestTemplate restTemplate;
private List<EmailEntity> EmailEntityIterator;
private static final Logger  logger = Logger.getLogger(EmailItemReader.class.getName());

/**
 * Constructor
 * @param restTemplate
 * The RestTemplate class allows us to call a
 * rest end point within the batch
 */
EmailItemReader(RestTemplate restTemplate) {
    this.restTemplate = restTemplate;
    nextEmailIndex=0;
}

/**
 * Checks if the list of emails is empty
 * Populates it by fetching unread emails
 * @return EmailEntity
 */
@Override
public EmailEntity read(){

    if (isEmailEntityInitialised()) {
        EmailEntityIterator = fetchEmails();
    }

    EmailEntity nextEmail = null;

    if (nextEmailIndex < EmailEntityIterator.size() && nextEmailIndex < 50) {
        nextEmail = EmailEntityIterator.get(nextEmailIndex);
        nextEmailIndex++;
    }

    System.out.println("The email index :- " + nextEmailIndex);

    return nextEmail;
}
/**
 * Returns a list of unread emails
 * @return List<EmailEntity>
 */
private List<EmailEntity> fetchEmails() {

    restTemplate.setMessageConverters(getMessageConverters());

    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_JSON_UTF8));

    HttpEntity<String> entity = new HttpEntity<>(httpHeaders);

    ResponseEntity<EmailEntity[]> response =
            restTemplate.exchange(apiURI, HttpMethod.GET, entity, EmailEntity[].class, 100);

    EmailEntity[] partialEmailEntity = response.getBody();

    List<EmailEntity> partialEmailEntityList = Arrays.asList(partialEmailEntity);

    List<EmailEntity> EmailEntityList =  new ArrayList<>();

    for (EmailEntity EmailEntity: partialEmailEntityList) {

        logger.info("The UUID :" + EmailEntity.getUuid() );
        ResponseEntity<EmailEntity>  fullResponce =
                restTemplate.exchange(apiURI+EmailEntity.getUuid(), HttpMethod.GET, entity, EmailEntity.class, 100);
                 EmailEntity fullEmail = fullResponce.getBody();

                 EmailEntityList.add(fullEmail);
                 logger.info("The full email : "+ fullEmail);
    }

    printEmailsToLogs(EmailEntityList);

    return EmailEntityList;
}

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

@ContextConfiguration
@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class,
    StepScopeTestExecutionListener.class })
@RunWith(SpringJUnit4ClassRunner.class)
public class EmailItemReaderTest {
@Mock
private RestTemplate restTemplate;

@InjectMocks
private EmailItemReader reader;


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

@Test
public void read() {

  PlainContent plainContent = new PlainContent();
  plainContent.setData("test");

  RawEmail rawEmail = new RawEmail();
  rawEmail.setData("Raw email");

  EmailEntity mockEntity1 = new EmailEntity();
  mockEntity1.setBody(plainContent);
  mockEntity1.setContactNumberRequired(true);
  mockEntity1.setContactNumber("0000000000");
  mockEntity1.setStructured(true);
  mockEntity1.setSubjectActive(true);
  mockEntity1.setConfigEmailSubjectId(1);
  mockEntity1.setSubjectLine("subject");
  mockEntity1.setRawEmail(rawEmail);

  EmailEntity[] testArray =  new EmailEntity[1];
  testArray[0] = mockEntity1;

  ResponseEntity<EmailEntity[]> mockEntity = Mockito.spy(new ResponseEntity(HttpStatus.OK));

  Mockito.doReturn(mockEntity).when(restTemplate).exchange(
            Mockito.any(URI.class),
            Mockito.any(HttpMethod.class),
            Mockito.any(HttpEntity.class),
            Mockito.eq(Class[].class)
    );

    reader.read();
    Mockito.verify(restTemplate).exchange(Mockito.any(URI.class),Mockito.any(HttpMethod.class),Mockito.any(HttpEntity.class), Mockito.eq(EmailEntity[].class));

    }
}

Пожалуйста, помогите с любой информацией или предложениями, которые могут помочь.Спасибо заранее.

1 Ответ

0 голосов
/ 28 ноября 2018

Окончательно решены проблемы: мой ответ не был нулевым, но мое тело ответа было нулевым.Таким образом, я добавил ложные данные для ответа.Поэтому я заменил это:

EmailEntity[] testArray =  new EmailEntity[1];
testArray[0] = mockEntity1;

ResponseEntity<EmailEntity[]> mockEntity = Mockito.spy(new ResponseEntity(HttpStatus.OK));

на это:

EmailEntity[] testArray =  new EmailEntity[1];
testArray[0] = mockEntity1;

ResponseEntity<EmailEntity[]> mockPartialEntity = Mockito.spy(new ResponseEntity<>(emailEntities, HttpStatus.OK));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...