Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino

Mock-Framework für JUnit Tests

<< < (3/7) > >>

flaite:
Sieht gut aus.
Falls jemand Interesse hat, schick ich bis zum 15.1. eine einfach zu benutzende Ausstattung mit Beschreibung der Einrichtung einer Umgebung in Eclipse.
(axel punkt janssen at gmail punkt com
Das ist keine Bug-Show. Ist dann wirklich stabil.
Meine eigene Implementierung unterstützt die grundlegenden Merkmale einer Notes Datenbank, die für die Aufgabe benötigt werden.
Ansichten mit Selektionsformeln (zur Zeit: Itemname-Formeln, dh. sowas wie Select form = "maske1" und @all) und Sortierung.
DocumentCollection
Spalten. 
Dokumente, Profil-Dokumente.
Items (kein RichText, z.Zt. keine Datumsfelder).
AgentBase, Session und AgentContext müssen noch. Die sind aber auch nicht so groß. 

Liefer das mit Beispielen aus und will nicht endlos erklären.
Kann wirklich auch für Java noobs interessant sein. 

flaite:
Hier mein erster Agent auf meinem eigenen Notes:

Man beachte, dass die ganzen verwendeten Notes Klassen quasi "Nachbauten" sind. Für dieses Testsystem, braucht kein Notes auf dem Rechner vorhanden sein. Ok. Ausnahme ist noch die Klasse lotus.domino.NotesException. Ist ja auch ne beta  ;D

Ging eigentlich ziemlich gut, wobei mein eigenes Notes nicht komplett ist.
Aber zumindest ich brauch für die meisten Java Agenten eben diese Klassen.
Weitere Klassen können natürlich noch hinzugefügt werden. RichText wird vermutlich nicht so einfach, aber wer weiss.
Ziemlich gut gelungen ist schon die Sortierung von Ansichten.  8)


--- Code: ---package de.spintegration.mock.examples;

import java.util.Vector;

import java.util.Iterator;

import lotus.domino.NotesException;

import de.spintegration.notes.mock.AgentBase;
import de.spintegration.notes.mock.AgentInfo;
import de.spintegration.notes.mock.Database;
import de.spintegration.notes.mock.Document;
import de.spintegration.notes.mock.DocumentCollection;
import de.spintegration.notes.mock.Item;
import de.spintegration.notes.mock.MockFactory;
import de.spintegration.notes.mock.View;
import de.spintegration.notes.mock.ViewColumn;

/**
 * @author ajanssen
 *
 */
public class SimpleAgent extends AgentBase {


/* (non-Javadoc)
* @see de.spintegration.notes.mock.AgentBase#NotesMain()
*/
public void NotesMain() {
try {
System.out.println ("********************************");
System.out.println ("SESSION.GETNOTESVERSION :-). ");
System.out.println ("********************************");

System.out.println(session.getNotesVersion());
Database dbCur = agentContext.getCurrentDatabase();
View vw1 = dbCur.getView("ansicht1");


System.out.println ("********************************");
System.out.println ("ANSICHT");
System.out.println ("********************************");

System.out.println(vw1.prettyPrint());

Document docAfro = vw1.getDocumentByKey("Afrika");
Vector itemAfro = docAfro.getItems();
Iterator itItemAfro = itemAfro.iterator();

System.out.println ("********************************");
System.out.println ("FELDWERTE DES PER DOKUMENT-by-Key(Afrika) gefundenen Dokuments");
System.out.println ("********************************");

while (itItemAfro.hasNext()) {
String fieldName = itItemAfro.next().toString();
Item item = docAfro.getFirstItem(fieldName);
System.out.println(item.getName() + "-->" + item.getValues());
}

System.out.println ("********************************");
System.out.println ("KONGO-Dokument einfügen");
System.out.println ("UND BEACHTET WIE SICH DAS EINSORTIERT, KONTINENT UND LAND SIND SORTIERTE SPALTEN,s. main Methode oben");
System.out.println ("********************************");


Document docNewAfro = dbCur.createDocument();
docNewAfro.replaceItemValue("form", "maske5");
docNewAfro.replaceItemValue("kontinent", "Afrika");
docNewAfro.replaceItemValue("land", "Kongo");
docNewAfro.replaceItemValue("staedte", "Kinshasa");
docNewAfro.save();

System.out.println(vw1.prettyPrint());


System.out.println ("********************************");
System.out.println ("Dokument Collection-> GIBT JA JETZT 2 DOKUMENTE MIT KEY AFRIKA");
System.out.println ("********************************");

DocumentCollection colAfro = vw1.getAllDocumentsByKey("Afrika");
docAfro = colAfro.getFirstDocument();

while (docAfro != null) {
itemAfro = docAfro.getItems();
itItemAfro = itemAfro.iterator();

System.out.println ("********************************");
System.out.println ("Dokument IN Collection");
System.out.println ("********************************");

while (itItemAfro.hasNext()) {
String fieldName = itItemAfro.next().toString();
Item item = docAfro.getFirstItem(fieldName);
System.out.println(item.getName() + "-->" + item.getValues());
}

docAfro = colAfro.getNextDocument();
}




} catch (NotesException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}

public static void main (String[] args) throws NotesException {
/*
* ERSTMAL MUSS DIE DATENBANK DEFINIERT WERDEN
* IST ZUGEGEBEN EIN WENIG MÜHSELIG.
* WERD ABER EINE MÖGLICHKEIT DER DEFINITION DER DATENBANK MIT XML ANBIETEN.
*/
MockFactory fac = MockFactory.getInstance();
Database parentDatabase = fac.getDatabase("test", "test.nsf");

// view definieren -> SORTIERUNG BEACHTEN.
View vw1 = fac.addView(parentDatabase, "ansicht1", "@all");
fac.addViewColumn(vw1, "form", "form");
fac.addViewColumn(vw1, "kontinent", "kontinent", ViewColumn.SORT_ASCENDING);
fac.addViewColumn(vw1, "land", "land", ViewColumn.SORT_ASCENDING);
fac.addViewColumn(vw1, "städte", "staedte");


// DOKUMENTE DIE VOR LAUF DES AGENTEN DA SIND. 
Document doc1 = fac.addDocumentWithForm(parentDatabase, "maske1");
doc1.replaceItemValue("kontinent", "Europa");
doc1.replaceItemValue("land", "Deutschland");
Vector vecStädteDoc1 = new Vector();
vecStädteDoc1.add("Köln");
vecStädteDoc1.add("Hannover");
vecStädteDoc1.add("Frankfurt");
doc1.replaceItemValue("staedte", vecStädteDoc1);
doc1.save();

Document doc2 = fac.addDocumentWithForm(parentDatabase, "maske2");
doc2.replaceItemValue("kontinent", "Europa");
doc2.replaceItemValue("land", "Groß Britannien");
Vector vecStädteDoc2 = new Vector();
vecStädteDoc2.add("London");
vecStädteDoc2.add("Glasgow");
vecStädteDoc2.add("Manchester");
doc2.replaceItemValue("staedte", vecStädteDoc2);
doc2.save();

Document doc3 = fac.addDocumentWithForm(parentDatabase, "maske3");
doc3.replaceItemValue("kontinent", "Amerika");
doc3.replaceItemValue("land", "Argentinien");
Vector vecStädteDoc3 = new Vector();
vecStädteDoc3.add("Buenos Aires");
vecStädteDoc3.add("Cordoba");
vecStädteDoc3.add("Mendoza");
doc3.replaceItemValue("staedte", vecStädteDoc3);
doc3.save();

Document doc4 = fac.addDocumentWithForm(parentDatabase, "maske4");
doc4.replaceItemValue("kontinent", "Asien");
doc4.replaceItemValue("land", "Indien");
Vector vecStädteDoc4 = new Vector();
vecStädteDoc4.add("Mumbai");
vecStädteDoc4.add("Kalkutta");
vecStädteDoc4.add("Bangalore");
doc4.replaceItemValue("staedte", vecStädteDoc4);
doc4.save();

Document doc5 = fac.addDocumentWithForm(parentDatabase, "maske5");
doc5.replaceItemValue("kontinent", "Afrika");
doc5.replaceItemValue("land", "Maroko");
Vector vecStädteDoc5 = new Vector();
vecStädteDoc5.add("Marakesch");
vecStädteDoc5.add("Fes");
vecStädteDoc5.add("Rabat");
doc5.replaceItemValue("staedte", vecStädteDoc5);
doc5.save();

// set AGENTIFO
AgentInfo agInfo = new AgentInfo(fac);
agInfo.setCurrentDatabase(parentDatabase);


// AGENT STARTEN
SimpleAgent sa = new SimpleAgent();
sa.startup(agInfo);
}

}

--- Ende Code ---

und hier die Ausgabe:


--- Code: ---********************************
SESSION.GETNOTESVERSION :-).
********************************
Happy Sandbox Notes, Release 0.4 Copper Edition|21st Century.
********************************
ANSICHT
********************************
Datenbank=test(test.nsf)
Ansicht=ansicht1, Selektionsformel=@all

form  |kontinent|land           |städte                      |
______|_________|_______________|____________________________|
maske5|Afrika   |Maroko         |Marakesch,Fes,Rabat         |
______|_________|_______________|____________________________|
maske3|Amerika  |Argentinien    |Buenos Aires,Cordoba,Mendoza|
______|_________|_______________|____________________________|
maske4|Asien    |Indien         |Mumbai,Kalkutta,Bangalore   |
______|_________|_______________|____________________________|
maske1|Europa   |Deutschland    |Köln,Hannover,Frankfurt     |
______|_________|_______________|____________________________|
maske2|Europa   |Groß Britannien|London,Glasgow,Manchester   |
______|_________|_______________|____________________________|

********************************
FELDWERTE DES PER DOKUMENT-by-Key(Afrika) gefundenen Dokuments
********************************
staedte-->[Marakesch, Fes, Rabat]
form-->[maske5]
land-->[Maroko]
kontinent-->[Afrika]
********************************
KONGO-Dokument einfügen
UND BEACHTET WIE SICH DAS EINSORTIERT, KONTINENT UND LAND SIND SORTIERTE SPALTEN,s. main Methode oben
********************************
Datenbank=test(test.nsf)
Ansicht=ansicht1, Selektionsformel=@all

form  |kontinent|land           |städte                      |
______|_________|_______________|____________________________|
maske5|Afrika   |Kongo          |Kinshasa                    |
______|_________|_______________|____________________________|
maske5|Afrika   |Maroko         |Marakesch,Fes,Rabat         |
______|_________|_______________|____________________________|
maske3|Amerika  |Argentinien    |Buenos Aires,Cordoba,Mendoza|
______|_________|_______________|____________________________|
maske4|Asien    |Indien         |Mumbai,Kalkutta,Bangalore   |
______|_________|_______________|____________________________|
maske1|Europa   |Deutschland    |Köln,Hannover,Frankfurt     |
______|_________|_______________|____________________________|
maske2|Europa   |Groß Britannien|London,Glasgow,Manchester   |
______|_________|_______________|____________________________|

********************************
Dokument Collection-> GIBT JA JETZT 2 DOKUMENTE MIT KEY AFRIKA
********************************
********************************
Dokument IN Collection
********************************
staedte-->[Kinshasa]
form-->[maske5]
land-->[Kongo]
kontinent-->[Afrika]
********************************
Dokument IN Collection
********************************
staedte-->[Marakesch, Fes, Rabat]
form-->[maske5]
land-->[Maroko]
kontinent-->[Afrika]

--- Ende Code ---

MadMetzger:
Da hast du aber bisher ganze Arbeit geleistet, Axel! Sieht echt nicht schlecht aus...

flaite:
Danke. Vor allem mehr Arbeit als ich dachte.
Ich feil noch ein paar Ecken ab, bau vielleicht noch ein paar Features ein (so dafür Zeit ist) und geb das am 15. raus.
Ich kanns wirklich selbst gebrauchen, wobei ich natürlich auch nicht weiss, ob ich nächstes Jahr viele Notes Agenten schreiben werde.
Hat aber auch wirklich Spaß gemacht das zu schreiben.
UniqueIDs und DocIDs gibts auch (ist auch nicht so schwierig, weils nicht verteilt ist).
Nächstes Feature wären Leserfelder wirklich unterstützen. Vielleicht das Notes-Datumszeugs. Gehen tut das alles.
Vielleicht interessieren sich Kerr Rainey oder Ben Poole dafür.
Mein AgentContext hat vor und nach Aufruf von NotesAgent einen Interceptor. Damit kann man difs vor und nach dem Agentlauf für Unit-Tests schreiben. Ist aber noch nicht getestet.

flaite:
Vielleicht verwende ich irgendwann couchDB als Persistenz-Speicher, hihi. (http://damienkatz.net/2008/01/new_gig.html)
Zur Zeit ist das ja eine reine in-memory Datenbank, was für unit-Tests auch völlig richtig ist.

Gruß Axel 

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln