Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 29-06-2009, 13:19   #1 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Mock Objekte mit Mockito

Moin,
versuche gerade die Mock Objekte meiner Unit-Tests mit Mockito zu erzeugen.
Allerdings ist die Doku äußerst mager, und die API scheint sich von der Java-API doch zu unterscheiden.

Weiß jemand, wie man damit jetzt einen Testcase schreibt, indem erstens Rückgabewerte von Stub-Methoden definiert werden, zweitens deren Aufrufzahl festgelegt wird, drittens die Test-Aktion angestoßen wird, und viertens geprüft wird, ob der Test erfolgreich war?
Das Beispiel auf der Seite sagt mir dazu leider garnix, und der Code ist auch nicht dokumentiert
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 01-07-2009, 11:59   #2 (permalink)
thinkin aBout tha lib.
 
Benutzerbild von kaneda
 
Registriert seit: Nov 2001
Ort: Kölle
Beiträge: 1.379
Hmm

Total komische API,

Der test könnte vielleicht klarheit schaffen:

http://bitbucket.org/loomis/mockito-...estMatchers.as

Ich glaub aber das vielleicht das hier:

http://sourceforge.net/projects/asmock/

angenehmer ist.
__________________
Back to community with http://leichtgewicht.at
kaneda ist offline   Mit Zitat antworten
Alt 01-07-2009, 12:15   #3 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Hi kaneda, vielen Dank für deine Antwort!

Leider verstehe ich von dem Test nur Bahnhof, das einzige was ich sehe ist, dass man den ersten Test mit FlexUnit deutlich eleganter ([Test(expects="...")]) erledigen könnte.

Witziger Weise baut ja Mockito auf ASMock auf:
Zitat:
Zitat von http://bitbucket.org/loomis/mockito-flex/wiki/Home
The main idea was to introduce a better and simpler testing for Flex to use with the Sabre CSS project. We made hacks on asmock framework and gave it a new face.
Also ob die ihr Ziel erreicht haben sei hiermit mal in Frage gestellt, vielleicht habe ich aber auch nur zu wenig Erfahrung in der Materie.

Die Syntax von ASMock ist zwar etwas langwieriger, dafür scheint mir wesentlich weniger Magie enthalten, vielleicht könnte ich sogar nachvollziehen, was da bei so einem Test vor sich geht.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 01-07-2009, 15:18   #4 (permalink)
thinkin aBout tha lib.
 
Benutzerbild von kaneda
 
Registriert seit: Nov 2001
Ort: Kölle
Beiträge: 1.379
Hmm

Also [Test(expects)] ist irgendwie was ganz anderes ...

http://asmock.sourceforge.net/tutorial/

das tutorial dürfte hilfreich sein.
__________________
Back to community with http://leichtgewicht.at
kaneda ist offline   Mit Zitat antworten
Alt 01-07-2009, 15:31   #5 (permalink)
thinkin aBout tha lib.
 
Benutzerbild von kaneda
 
Registriert seit: Nov 2001
Ort: Kölle
Beiträge: 1.379
Nur so für die Übersicht

Vielleicht noch ein paar Dinge dazu erwähnt zum thema Mockobjekte (hab das Gefühl das es nicht ganz klar ist, vielleicht erkläre ich jetzt auch was ganz banales...)

Prinzipiell "record"et man was mit einem Objekt passieren soll und was das Objekt die verschiedenen Aufrufe zurückggeben sollen. Dann lässt man das Mock auf die Welt los und danach sagt man dem Mock das alles abgearbeitet wurde. Fehlt nach dem Abarbeiten ein Schritt fliegt eine Exception - macht die Welt etwas mit dem Mockobjekt da nicht vorgesehen war auch.

Abstrakt gesprochen:


ActionScript:
  1. var mockControl: MockControl = new MockControl(Type);
  2. var mock: Type = mockControl.mock; // automatisch im recordmode
  3.  
  4. mock.doSomeThing();
  5. mockControl.returnValue( "its me, mario" );
  6.  
  7. mock.doAnotherThing();
  8.  
  9. mockControl.switchToPlayMode(); // jetzt im playmode - wird eine falsche methode aufgerufen fliegt eine exception
  10.  
  11. MyUtil.handle( mock ); // der mock wird in das zu testende system gesteckt, wehe es ruft das falsche auf
  12.  
  13. mockControl.finish(); // Überprüfung das ja auch wirklich alle methoden aufgerufen wurden.
  14.  

Das ist so die Basis wie so Zeugs funktioniert - quasi alle Api ist da gleich gestrickt - manche komplexer, andere weniger komplex. Es gibt z.B. so Features wie "diese Methode wird jetzt x-beliebig of ausgeführt" oder so. Manche wollen auch das man alles nur übers Mockcontrol macht - das ist je nach Geschmack und Intelligenz.

Sinn der Sache (noch kurz): Man überprüft ob das MyUtil auch tatsächlich nichts falsches mit dem Objekt macht....
__________________
Back to community with http://leichtgewicht.at
kaneda ist offline   Mit Zitat antworten
Alt 01-07-2009, 17:49   #6 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Jo, das hatte ich auch so verstanden (hatte das von dir gelinkte Tutorial bereits angesehen) nur kann ich diese Beschreibung in den Beispielen die ich zu Mockito finde nicht wirklich nachvollziehen.

Nehmen wir mal den zweiten Test von deinem ersten Link zu diesem Thema hier:
PHP-Code:
        // given
        
var mockie:TestClass TestClass(mock(TestClass));

        
//when
        
mockie.baz("one"145);

        
// then
        
verify().that(mockie.baz(eq("one"), any())); 
Die ersten zwei Schritte ... ok, schätze das //when ... entspricht der Recording-Phase.
Aber der letzte Schritt Ich sehe keinen Schritt der dem entsprechen würde, was du "Playmode" nennst. Wie kann man verifizieren, ohne es ausprobiert zu haben? Wie kann er eine Methode einmal so, und einmal so aufrufen?

Der erste Test in der selben Klasse erscheint mir immernoch hässlich Hat zwar nichts mit Mock-Objekten zu tun, aber die Exception so festzustellen erscheint mir nicht gerade sinnvoll.

Denke ich werde zu asmock zurück kehren. Dank der expliziten Einleitung der verschiedenen Phasen finde ich die Tests wesentlich aussagekräftiger.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 02-07-2009, 10:38   #7 (permalink)
thinkin aBout tha lib.
 
Benutzerbild von kaneda
 
Registriert seit: Nov 2001
Ort: Kölle
Beiträge: 1.379
Glauben... glauben...

Man braucht bei Operationen ohne Return typ keine Record-Phase. Im klartext: Wenn die Operationen aufgerufen werden geben sie nichts zurück. Es fliegt aber eben auch keine exception.

Mockito ist so aufgebaut wenn ichs richtig verstehe:
ActionScript:
  1. ... extends MockitoTestCase // instanziert einen MockManager der intern verschiedene MockControls hält
  2.  

ActionScript:
  1. var x:Array = mock( Array ) as Array; // erzeugt einen controller im hintergrund der die operationen aufzeichnet
  2.  
  3. x.push("1"); // ist eine herkömmliche operation - wird einfach in der playback liste hinzugefügt.
  4.  
  5. verify().that(...); // Nimmt das letzte playback statement, entfernt es aus der playback liste und überprüft in der playback liste ob es auf der aktuellen zeigerposition auch ausgeführt wurde
  6.  
  7. eq("one"); // Erzeugt einen Spezialfall für parameter die auf equal gecheckt werden sollen.
  8.  

Jetzt das ganze noch für operationen betrachted die was zurückgeben sollen:

ActionScript:
  1. given( ... ); // nimmt das letzte ausgeführte statement(ähnlich zu verify().that) und erzeugt ein Prerecord statement auf dem man sagen kann was in der nächsten Operation mit diesem statement passiert.
  2.  
  3. given( ... ).willReturn("A"); // Sagt im statement das die nächste Methode "A" returned.
  4.  
  5. // jetzt mal so mit schuss ins blaue
  6. given( ... ).willThrow( new IllegalArguementException()) ) // Sagt das ne exception geschmissen wird.
  7.  
__________________
Back to community with http://leichtgewicht.at

Geändert von kaneda (02-07-2009 um 10:41 Uhr)
kaneda ist offline   Mit Zitat antworten
Alt 02-07-2009, 10:53   #8 (permalink)
thinkin aBout tha lib.
 
Benutzerbild von kaneda
 
Registriert seit: Nov 2001
Ort: Kölle
Beiträge: 1.379
Nachtrag

Hab eben auch die Java Version mit mehr doku gefunden: http://mockito.org/
__________________
Back to community with http://leichtgewicht.at
kaneda ist offline   Mit Zitat antworten
Alt 31-07-2009, 08:32   #9 (permalink)
thinkin aBout tha lib.
 
Benutzerbild von kaneda
 
Registriert seit: Nov 2001
Ort: Kölle
Beiträge: 1.379
Documentation

Die Jungs haben ein bischen Documentation dazu online gestellt:

http://bitbucket.org/loomis/mockito-...ls/Tutorial1.0

*cheers!*
__________________
Back to community with http://leichtgewicht.at
kaneda ist offline   Mit Zitat antworten
Alt 31-07-2009, 09:35   #10 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Hey, vielen Dank!

Hab in der Zwischenzeit bissel damit gearbeitet, ist wirklich ne feine Sache!
Die Syntax ist immernoch gewöhnungsbedürftig, dafür ist das Ergebnis kompakt, und nach einiger Zeit auch lesbar.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele