Domanda

Sono nuovo di jmock e sto cercando di deridere una HttpSession. Ricevo:

java.lang.AssertionError: invocazione imprevista: httpServletRequest.getSession () nessuna aspettativa specificata: hai ...  - dimenticare di iniziare un'aspettativa con una clausola di cardinalità?  - chiamare un metodo deriso per specificare il parametro di un'aspettativa?

il metodo di prova:

@Test

public void testDoAuthorization(){

    final HttpServletRequest request = context.mock(HttpServletRequest.class);
    final HttpSession session = request.getSession();

    context.checking(new Expectations(){{
       one(request).getSession(true); will(returnValue(session));
   }});

    assertTrue(dwnLoadCel.doAuthorization(session));
}

Ho fatto un po 'di ricerche e non mi è ancora chiaro come sia fatto. Mi sento come se mi mancasse un piccolo pezzo. Chiunque abbia esperienza in questo può semplicemente indicarmi la giusta direzione. grazie

È stato utile?

Soluzione

Non è necessario deridere l'oggetto richiesta. Poiché il metodo che stai testando ( dwnLoadCel.doAuthorization () ) dipende solo da un oggetto HttpSession , questo è ciò che dovresti prendere in giro. Quindi il tuo codice sarebbe simile al seguente:

public void testDoAuthorization(){
    final HttpSession session = context.mock(HttpSession.class);

    context.checking(new Expectations(){{
        // ???
    }});

    assertTrue(dwnLoadCel.doAuthorization(session));

}

La domanda diventa: cosa ti aspetti che SUT faccia effettivamente con l'oggetto sessione? Devi esprimere nelle tue aspettative le chiamate a session e i loro corrispondenti valori di ritorno che dovrebbero tradursi in doAuthorization che restituisce true .

Altri suggerimenti

Penso che devi dire al contesto JMock quante volte ti aspetti che venga chiamato il metodo prima di andare avanti e chiamarlo.

final HttpServletRequest request = context.mock(HttpServletRequest.class);

context.checking(new Expectations(){{
  one(request).getSession(true); will(returnValue(session));
}});

final HttpSession session = request.getSession();

Non ho molta familiarità con JMock ma in realtà ti interessa il test dell'unità dwnLoadCel quante volte vengono chiamati determinati metodi nell'oggetto deriso? Oppure stai solo cercando di testare la tua classe che dipende da una sessione HTTP senza una sessione reale? Se è l'ultimo di quanto penso che JMock sia eccessivo per te.

Potresti voler esaminare tu stesso la creazione di una classe che implementa l'interfaccia HttpSession solo a scopo di unit test (uno stub), e di eseguire i tuoi test al di fuori di esso, oppure dovresti prendere dare un'occhiata a dwnLoadCel e determinare se davvero deve avere un riferimento a HttpSession o se necessita solo di alcune proprietà all'interno di HttpSession. Refactor dwnLoadCel dipende solo da ciò di cui ha effettivamente bisogno (una Mappa o un determinato valore di parametro all'interno dell'oggetto Session) - questo renderà più semplice il test dell'unità (la dipendenza dal il contenitore del servlet va ciao).

Penso che tu abbia già provato un certo livello di iniezione di dipendenza nella tua classe, ma potresti dipendere da un oggetto troppo ampio. Il blog di prova di Google ha avuto molto of excellent articoli su DI recentemente che potresti trovare utili (ne sono sicuro).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top