Cómo limpiar simulacros en las pruebas de primavera al usar Mockito

Soy bastante nuevo en Mockito y tengo algunos problemas con la limpieza.

Solía ​​usar JMock2 para pruebas unitarias. Por lo que sé, JMock2 conserva las expectativas y otra información simulada en un contexto que se reconstruirá para cada método de prueba. Por lo tanto, cada método de prueba no es interferido por los otros.

Adopté la misma estrategia para las pruebas de primavera al usar JMock2, encontré un problema potencial con las estrategias que usé en mienviar: El contexto de la aplicación se reconstruye para cada método de prueba y, por lo tanto, ralentiza todo el procedimiento de prueba.

Noté que muchos artículos recomiendan el uso de Mockito en las pruebas de primavera y me gustaría intentarlo. Funciona bien hasta que escribo dos métodos de prueba en un caso de prueba. Cada método de prueba pasó cuando se ejecutó solo, uno de ellos falló si se ejecutaron juntos. Especulé que esto se debe a que la información simulada se conservó en el simulacro en sí (porque no veo ningún objeto de contexto como el de JMock) y la simulación (y el contexto de la aplicación) se comparte en ambos métodos de prueba.

Lo resolví agregando reset () en el método @Before. Mi pregunta es ¿cuál es la mejor práctica para manejar esta situación (el javadoc de reset () dice que el código es olor si necesitas reset ())? Cualquier idea es de agradecer, gracias de antemano.

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

}

Respuestas a la pregunta(4)

Su respuesta a la pregunta