Я пытаюсь протестировать приведенный ниже класс, который является средством чтения 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));
}
}
Пожалуйста, помогите с любой информацией или предложениями, которые могут помочь. Заранее спасибо.
Привет, это правда. И полученный мной нулевой указатель находится в строке внутри метода fetchEmails (). На этой строке EmailEntity [] partialEmailEntity = response.getBody ();
NPE в этой строке означает, что ответ нулевой. Я вижу, что вы используете шпион, и ответ не равен нулю, поэтому должна быть какая-то насмешливая проблема, и этот ответ не возвращается остальным шаблоном. Вероятно, попробуйте Mockito.eq(EmailEntity[].class) instead of Mockito.eq (Class []. Class) `, когда вы имитируете метод обмена resttemplate или Mockito.any(Class[].class) вместо Mockito.eq(Class[].class).
Наконец, проблемы были решены: мой ответ не был нулевым, но мое тело ответа было нулевым. Поэтому я добавил фиктивные данные, чтобы получить ответ. Поэтому я заменил это:
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));
Какой код у
isEmailEntityInitialised? Если в вашем тесте это не так,fetchEmails()никогда не будет вызван, и ваш макет никогда не будет использоваться.