Como limpar zombarias nos testes de primavera ao usar o Mockito

Eu sou muito novo no Mockito e tenho alguns problemas com a limpeza.

Eu costumava usar o JMock2 para testes de unidade. Tanto quanto sei, o JMock2 preserva as expectativas e outras informações simuladas em um contexto que será reconstruído para cada método de teste. Portanto, todo método de teste não é interferido pelos outros.

Adotei a mesma estratégia para testes de primavera ao usar o JMock2, encontrei um problema em potencial com as estratégias que usei no meupostar: O contexto do aplicativo é recriado para cada método de teste e, portanto, retarda todo o procedimento de teste.

Eu notei muitos artigos recomendam usando Mockito em testes de primavera e eu gostaria de ter uma tentativa. Funciona bem até eu escrever dois métodos de teste em um caso de teste. Cada método de teste foi aprovado quando foi executado sozinho. Um deles falhou quando eles foram executados juntos. Eu especulei que isso é porque a informação simulada foi preservada no próprio mock (porque eu não vejo nenhum objeto de contexto como esse no JMock) e o mock (e o contexto do aplicativo) é compartilhado em ambos os métodos de teste.

Eu resolvi adicionando reset () no método @Before. Minha pergunta é qual é a melhor prática para lidar com essa situação (o javadoc de reset () diz que o código é cheiro se você precisar de reset ())? Qualquer ideia é apreciada, obrigado antecipadamente.

@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(...);

}

questionAnswers(4)

yourAnswerToTheQuestion