издевательский метод возвращает Null

#java #junit #integration-testing #mockito

#java #junit #тестирование интеграции #mockito

Вопрос:

Я пытаюсь издеваться над несколькими вызовами метода, но, к сожалению, я продолжаю возвращать значение null. Можете ли вы помочь мне указать, где я могу ошибаться? Я использую when().thenReturn(), и я чувствую, что правильно издевался над возвращаемой переменной. Заранее большое спасибо. Я новичок в JUnit и Mockito, поэтому приношу свои извинения, если я упускаю что-то очевидное.

ServiceTest.java

 @IntegrationTest
public class ServiceTest extends TransactionalTest {
    private HistoryService orderHistoryService;
    private CMSSiteModel website;

@Mock
protected DefaultWebService orderDetailsServiceWrapper;
@Mock
protected WebsiteService websiteService;    

@Before
public void setUp()
{
    MockitoAnnotations.initMocks(this);
    website = mock(CMSSiteModel.class);
}

@Test
public void testFindOrderDetailsByConfirmationNumber() {

    when(websiteService.getCurrentSite()).thenReturn(website);

    final ResponseType response = orderHistoryService.findOrderDetailsByConfirmationNumber(OrderTestUtils.CONFIRMATION_NUMBER, OrderTestUtils.LOCATION_NUMBER);

    Assert.assertEquals("Incorrect Approver Name", OrderTestUtils.APPROVER_NAME, response.getApprovedByName());
}
  

и Service.java

 public class HistoryService implements OrderHistoryService {

    @Autowired
    private WebsiteService websiteService;

    @Override
    public OrderDetailsServiceResponseType findOrderDetailsByConfirmationNumber(String confirmationNumber, String locationNumber) {

        CMSSiteModel test = websiteService.getCurrentSite();  //returning null
        odsrHeader.setSource(test.getOrderSource());

    }

}
  

Комментарии:

1. Где вы устанавливаете websiteService Service ?

2. В принципе, где orderHistoryService и как создается?

3. Скорее всего, вы забыли ввести mocks в тестируемый класс, как сказал @SotiriosDelimanolis. Взгляните на docs.mockito.googlecode.com/hg/latest/org/mockito / … для быстрого и приятного способа сделать это

4. Он возвращается null или вы получаете NullPointerException ?

Ответ №1:

Я думаю, вы предполагаете, что Mockito автоматически введет WebsiteService в OrderHistoryService . Вам нужно аннотировать OrderHistoryService with @InjectMocks , прежде чем Mockito сделает это. InjectMocks создаст обычный экземпляр класса, а затем попытается заполнить его поля любыми издевательскими или шпионскими классами, которые были созданы в рамках данного теста.

например.

 public class ServiceTest extends TransactionalTest {
    @InjectMocks
    HistoryService orderHistoryService;

    @Mock
    WebsiteService websiteService;

    ...

}
  

Это websiteService HistoryService не null вызывает беспокойства. Похоже, что где-то происходит какая-то другая инъекция, и вы получили две отдельные издевательские службы веб-сайта. Один в вашем тестовом классе, а другой в HistoryService . Похоже, вы пропустили довольно много тестовых классов, поэтому трудно быть уверенным, что происходит на самом деле.

Ответ №2:

Вот мой ответ: [Попробуйте написать модульный тестовый пример в одном классе]

Убедитесь websiteService , что он находится @Mock в классе Service.