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