#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.