Я новичок в Mockito и испытываю некоторые проблемы с очисткой.
Я использовал JMock2 для модульных тестов. Насколько я знаю, JMock2 сохраняет ожидания и другую макетную информацию в контексте, который будет перестроен для каждого тестового метода. Поэтому каждый тестовый метод не мешает другим.
Я применил ту же стратегию для тестов spring при использовании JMock2, я нашел потенциальную проблему со стратегиями, которые я использовал в post: Контекст приложения перестраивается для каждого метода тестирования и, следовательно, замедляет всю процедуру тестирования.
Я заметил, что многие статьи рекомендуют использовать Mockito в тестах spring, и я хотел бы попробовать. Он работает хорошо, пока я не напишу два тестовых метода в тестовом примере. Каждый тестовый метод передавался, когда он работал один, один из них не удался, если они работали вместе. Я предположил, что это связано с тем, что макетная информация была сохранена в макете (потому что я не вижу какого-либо контекстного объекта, подобного этому в 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(...);
}