java.lang.IllegalStateException: fehlende Verhaltensdefinition für den vorhergehenden Methodenaufruf getMessage ("title")
Bin ich mit EasyMock(version 2.4) und TestNG für das schreiben von UnitTest.
Ich habe Folgendes Szenario und kann ich nicht ändern die Art und Weise der Klassenhierarchie definiert.
Teste ich ClassB die Verlängerung ClassA.
ClassB so Aussehen
public class ClassB extends ClassA {
public ClassB()
{
super("title");
}
@Override
public String getDisplayName()
{
return ClientMessages.getMessages("ClassB.title");
}
}
ClassA-code
public abstract class ClassA {
private String title;
public ClassA(String title)
{
this.title = ClientMessages.getMessages(title);
}
public String getDisplayName()
{
return this.title;
}
}
Klasse ClientMessages code
public class ClientMessages {
private static MessageResourse messageResourse;
public ClientMessages(MessageResourse messageResourse)
{
this.messageResourse = messageResourse;
}
public static String getMessages(String code)
{
return messageResourse.getMessage(code);
}
}
MessageResourse Klasse code
public class MessageResourse {
public String getMessage(String code)
{
return code;
}
}
Testen ClassB
import static org.easymock.classextension.EasyMock.createMock;
import org.easymock.classextension.EasyMock;
import org.testng.Assert;
import org.testng.annotations.Test;
public class ClassBTest
{
private MessageResourse mockMessageResourse = createMock(MessageResourse.class);
private ClassB classToTest;
private ClientMessages clientMessages;
@Test
public void testGetDisplayName()
{
EasyMock.expect(mockMessageResourse.getMessage("ClassB.title")).andReturn("someTitle");
clientMessages = new ClientMessages(mockMessageResourse);
classToTest = new ClassB();
Assert.assertEquals("someTitle" , classToTest.getDisplayName());
EasyMock.replay(mockMessageResourse);
}
}
Wenn ich bin mit diesem test bin ich immer folgende exception:
java.lang.IllegalStateException: fehlende Verhalten definition für den vorhergehenden Aufruf der Methode getMessage("Titel")
Beim Debuggen was ich gefunden habe ist, es ist nicht in Anbetracht der mock-Methode aufrufen
mockMessageResourse.getMessage("ClassB.Titel") wie Sie genannt wurde aus der construtor (ClassB-Objekt erstellen).
Kann einer bitte helfen Sie mir, wie um zu testen, in diesem Fall.
Dank.
InformationsquelleAutor der Frage user362199 | 2010-06-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie rufen Sie
EasyMock.replay(mock)
vor dem Aufruf der Methode im test. Nach dem Aufruf der Methode unter test, den Sie anrufen könnenEasyMock.verify(mock)
zu überprüfen, die mock genannt wird.Als Nächstes müssen Sie fügen Sie ein weiteres
expect
Anruf mit dem "Titel" - argument, da nennt man es zweimal.Code:
InformationsquelleAutor der Antwort Julien Rentrop
In meinem Fall, es wurde verursacht durch den Wegfall der return-Wert Angabe (andReturn(...)).
http://www.smcmaster.com/2011/04/easymock-issue-1-missing-behavior.html für mehr details.
InformationsquelleAutor der Antwort Reda
Kann dies unterschiedliche Ursachen haben (
someMock
ist der name von Ihr verspottet Objekt in dieser Antwort).Auf der einen Seite kann es sein, dass Sie brauchen, um zu erwarten, dass der Anruf über
wie in Reda ' s Antwort.
Es kann auch sein, dass Sie vergessen haben, rufen Sie
replay(someMock)
bevor Sie die verspotten, wie Sie sehen können, in Julien Rentrop Antwort.Eine Letzte Sache, die möglich ist, die nicht hier erwähnt ist, ist, dass Sie die mock woanders, bevor Sie in einen test und vergessen zum zurücksetzen des mock über
reset(someMock)
.Dies kann passieren, wenn Sie mehrere Unit-Tests wie dieser:
Dies nicht ein test mit dem IllegalStateException, denn die mock-a wurde nicht zurückgesetzt werden, bevor Sie verwendet werden in den nächsten test. Um es zu lösen, können Sie Folgendes tun:
InformationsquelleAutor der Antwort lukaswelte
Dann sollten Sie Ihre call-to
replay
nach derexpect
Anrufe, und vor Sie Ihre mock. In diesem Fall sollten Sie Ihren test, so etwas wie dieses:InformationsquelleAutor der Antwort Mahdi