Frage

Ich bin neu in JMock und versuchen, eine HTTP-Sitzung zu verspotten. Ich erhalte:

java.lang.AssertionError: unerwarteter Aufruf: httpServletRequest.getSession () keine Erwartungen angegeben: haben Sie ...  - vergessen eine Erwartung mit einer Mächtigkeit Klausel zu beginnen?  - eine verspottet Methode aufrufen, die Parameter einer Erwartung angeben

das Testverfahren:

@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));
}

Ich habe ein bisschen suchen getan, und es ist mir nicht klar, nach wie vor, wie dies geschieht. Fühlt sich an wie ich etwas kleines Stück fehlte. Jeder, der Erfahrung in diesem kann zeigen Sie mir nur in die richtige Richtung. Dank

War es hilfreich?

Lösung

Sie brauchen nicht das Request-Objekt zu verspotten. Da das Verfahren Sie testen (dwnLoadCel.doAuthorization()) nur von einem HttpSession Objekt, das ist, was sollten Sie verspotten. So Ihr Code würde wie folgt aussehen:

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

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

    assertTrue(dwnLoadCel.doAuthorization(session));

}

Die Frage ist: Was erwarten Sie die SUT tatsächlich tun mit dem Session-Objekt? Sie müssen die Anrufe in Ihren Erwartungen zum Ausdruck bringen session und ihre entsprechenden Rückgabewerte, die angeblich in doAuthorization Rückkehr true führen.

Andere Tipps

Ich glaube, Sie müssen den JMock Kontext sagen, wie oft Sie die Methode erwarten, dass es genannt werden, bevor Sie tatsächlich gehen Sie vor und rufen.

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

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

final HttpSession session = request.getSession();

Ich bin nicht super mit JMock vertraut aber tatsächlich tun Sie in Ihrem dwnLoadCel Unit-Test, wie oft bestimmte Methoden im verspottete Objekt kümmern heißen? Oder versuchen Sie einfach Ihre Klasse zu testen, ohne eine tatsächliche Session auf einem Http abhängt? Falls Letzteres ist als ich denke, dass JMock Overkill für Sie.

Sie können in aussehen soll entweder eine Klasse erstellen, die die HttpSession selbst implementiert eine Schnittstelle für die Zwecke der Unit-Tests nur (a Stummel) und die Tests Ablaufen davon, oder sollten Sie einen Blick auf dwnLoadCel nehmen und festzustellen, ob es wirklich muss einen Verweis auf die Http haben, oder wenn es nur einige Eigenschaften innerhalb des Http muss. Umgestalten dwnLoadCel nur davon ab, was es wirklich braucht (einen Map oder einen bestimmten Parameterwert innerhalb des Session-Objekts.) - dies wird Ihr Gerät zu testen einfacher (die Abhängigkeit von den Servlet-Containern bye-bye geht) machen

Ich denke, dass Sie eine gewisses Maß an Dependency Injection in Ihrer Klasse haben bereits getestet, aber Sie könnten auf zu breit ein Objekt abhängig sein. Der Google-Test Blog hatte viel ausgezeichnet Artikel auf DI in letzter Zeit, dass Sie nützlich sein könnten (ich habe sicher).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top