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