Jak wyczyścić mocki w wiosennych testach podczas korzystania z Mockito

Jestem całkiem nowy dla Mockito i mam kłopoty z czyszczeniem.

Używałem JMock2 do testów jednostkowych. O ile wiem, JMock2 zachowuje oczekiwania i inne fałszywe informacje w kontekście, który zostanie odbudowany dla każdej metody testowej. Dlatego każda metoda testowa nie jest zakłócana przez inne.

Przyjąłem tę samą strategię testów wiosennych, gdy korzystałem z JMock2, znalazłem potencjalny problem ze strategiami, których użyłem w moimsłupek: Kontekst aplikacji jest przebudowywany dla każdej metody testowej i dlatego spowalnia całą procedurę testową.

Zauważyłem, że wiele artykułów zaleca używanie Mockito w wiosennych testach i chciałbym spróbować. Działa dobrze, dopóki nie napiszę dwóch metod testowych w przypadku testowym. Każda metoda testowa przeszła, gdy działała sama, jedna z nich zawiodła, jeśli działały razem. Spekulowałem, że dzieje się tak dlatego, że próbna informacja została zachowana w samym makiecie (ponieważ nie widzę żadnego obiektu kontekstowego takiego w JMocku), a makieta (i kontekst aplikacji) jest współużytkowany w obu metodach testowych.

Rozwiązałem go dodając reset () w metodzie @Before. Moje pytanie brzmi: jaka jest najlepsza praktyka, aby poradzić sobie z tą sytuacją (javadoc z reset () mówi, że kod jest smell, jeśli potrzebujesz reset ())? Każdy pomysł jest doceniany, dzięki z góry.

@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