Я новичок в Mockito, и у меня есть проблемы с очисткой.
Раньше я использовал JMock2 для модульных тестов. Насколько мне известно, JMock2 сохраняет ожидания и другую фиктивную информацию в контексте, который будет перестраиваться для каждого метода тестирования. Таким образом, ни один метод испытаний не взаимодействует с другими.
Я принял ту же стратегию для весенних тестов при использовании JMock2, я обнаружил потенциальную проблему со стратегиями, которые я использовал в моем post: контекст приложения перестраивается для каждого метода тестирования, что замедляет всю процедуру тестирования.
Я заметил, что многие статьи рекомендуют использовать Mockito в весенних тестах, и я хотел бы попробовать. Это работает хорошо, пока я не напишу два тестовых метода в тестовом примере. Каждый тестовый метод прошел успешно, если он выполнялся по отдельности. Один из них не прошел, если они выполнялись вместе. Я предположил, что это связано с тем, что фиктивная информация была сохранена в самом макете (потому что я не вижу никакого объекта контекста, подобного этому в JMock), а макет (и контекст приложения) используется совместно в обоих методах тестирования.
Я решил это, добавив reset() в метод @Before. Мой вопрос заключается в том, как лучше всего справиться с этой ситуацией (в javadoc reset() говорится, что код пахнет, если вам нужен reset())? Любая идея приветствуется, заранее спасибо.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"file:src/main/webapp/WEB-INF/booking-servlet.xml",
"classpath:test-booking-servlet.xml" })
@WebAppConfiguration
public class PlaceOrderControllerIntegrationTests implements IntegrationTests {
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Autowired
private PlaceOrderService placeOrderService;
@Before
public void setup() {
this.mockMvc = webAppContextSetup(this.wac).build();
reset(placeOrderService);// reset mock
}
@Test
public void fowardsToFoodSelectionViewAfterPendingOrderIsPlaced()
throws Exception {
final Address deliveryAddress = new AddressFixture().build();
final String deliveryTime = twoHoursLater();
final PendingOrder pendingOrder = new PendingOrderFixture()
.with(deliveryAddress).at(with(deliveryTime)).build();
when(placeOrderService.placeOrder(deliveryAddress, with(deliveryTime)))
.thenReturn(pendingOrder);
mockMvc.perform(...);
}
@Test
public void returnsToPlaceOrderViewWhenFailsToPlaceOrder() throws Exception {
final Address deliveryAddress = new AddressFixture().build();
final String deliveryTime = twoHoursLater();
final PendingOrder pendingOrder = new PendingOrderFixture()
.with(deliveryAddress).at(with(deliveryTime)).build();
NoAvailableRestaurantException noAvailableRestaurantException = new NoAvailableRestaurantException(
deliveryAddress, with(deliveryTime));
when(placeOrderService.placeOrder(deliveryAddress, with(deliveryTime)))
.thenThrow(noAvailableRestaurantException);
mockMvc.perform(...);
}