So bereinigen Sie Verspottungen bei Frühjahrstests mit Mockito

Ich bin ziemlich neu in Mockito und habe Probleme beim Aufräumen.

Ich habe JMock2 für Unit-Tests verwendet. Soweit mir bekannt ist, speichert JMock2 die Erwartungen und andere Scheininformationen in einem Kontext, der für jede Testmethode neu erstellt wird. Daher wird nicht jede Testmethode von den anderen gestört.

Bei der Verwendung von JMock2 habe ich die gleiche Strategie für Frühlingstests angewendet. Ich habe ein potenzielles Problem mit den Strategien gefunden, die ich in meinem verwendet habePost: Der Anwendungskontext wird für jede Testmethode neu erstellt und verlangsamt daher den gesamten Testvorgang.

Ich habe festgestellt, dass in vielen Artikeln die Verwendung von Mockito in Frühlingstests empfohlen wird, und ich würde es gerne versuchen. Es funktioniert gut, bis ich zwei Testmethoden in einem Testfall schreibe. Jede Testmethode bestand, wenn sie alleine lief. Eine von ihnen schlug fehl, wenn sie zusammen liefen. Ich spekulierte, dass dies darauf zurückzuführen ist, dass die Scheininformationen im Schein selbst erhalten geblieben sind (da ich in JMock kein ähnliches Kontextobjekt sehe) und der Schein (und der Anwendungskontext) in beiden Testmethoden geteilt wird.

Ich habe es durch Hinzufügen von reset () in der @ Before-Methode gelöst. Meine Frage ist, was die beste Praxis ist, um mit dieser Situation umzugehen (Der Javadoc von reset () sagt, dass der Code riecht, wenn Sie reset () benötigen)? Jede Idee ist dankbar, danke im Voraus.

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

}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage