Donnerstag, 31. Oktober 2013

JUnit Rules

Vor einiger Zeit bin ich zufällig über eine weniger bekannte Funktionalität von JUnit gestoßen: JUnit Rules.

Das Problem

Mit dem Rules Konstrukt verfügt JUnit seit einer ganzen Weile über die Möglichkeit, den Testablauf zu beeinflussen, also z.B. vor oder nach einem Test etwas zu tun.
Das klingt erstmal absolut unspannend, immerhin sind Methoden, die mit @Before und @After Annotationen versehen werden nicht gänzlich unbekannt. Also was soll das Ganze?

Versuchen wir es mal mit einem einfachen Beispiel:

Das Ergebnis davon sieht wenig überraschend wie folgt aus:

vor dem Test...
test
nach dem Test...


Nehmen wir an, uns gefällt was in den before() und after() Methoden passiert und wir möchten das wiederverwenden. Nichts einfacher als das:

Das Ergebnis der Ausführung dieser Klasse mit Hilfe von JUnit sieht wie folgt aus:

vor dem Test...
extended test
nach dem Test...
vor dem Test...
test
nach dem Test...


Durch Vererbung von JUnit Tests erhalten wir ein Verhalten, was nicht in jedem Fall gewünscht ist. Zunächst einmal werden alles Tests der Oberklasse ebenfalls ausgeführt. Des Weiteren haben wir keine Möglichkeit z.B. nur die before() Logik zu nutzen, ohne ebenfalls die Logik innerhalb der after() Methode auszuführen. Das Schränkt die Wiederverwendbarkeit stark ein und führt zu unübersichtlichen Klassenhierarchien.

Die Lösung: JUnit Rules

Mit Hilfe von JUnit Rules lässt sich das Problem elegent lösen. Die Rules stellen einen mit Interceptoren oder Aspekten vergleichbaren Mechanismus bereit unabhängig von der Klassenhierarchie zusätzliche Logik in den Testablauf einzubauen.

Wie funktioniert es? 

Um eine Rule zu definieren muss eine Klasse erstellt werden, die das Interface org.junit.rules.TestRule implementiert. Darin ist nur die Methode apply(Statement base, Description description) definiert. Hinter dem Statement-Objekt verbirgt sich der laufende JUnit Test welcher mit base.evaluate() ausgeführt werden kann. Davor und danach kann eigene Logik ausgeführt werden. Dies könnte z.B. wie folgt aussehen:

Um die Rule im eigenen JUnit Test verwenden zu können wird diese einfach als Klassenvariable instanziiert und mit der @Rule Annotation versehen:
Das Ergebnis des Tests sieht wie folgt aus:

vor dem Test...
test
nach dem Test...


Die Rule wird beim Aufruf jeder einzelner Test-Methode verwendet, analog zu @Before bzw. @After. Alternativ lässt sich die Rule einmalig für die Testklasse verwenden, hierfür ist nur die folgende Änderung notwendig:

JUnit bringt bereits einige vorgefertigte Rules mit, siehe https://github.com/junit-team/junit/wiki/Rules

Freitag, 4. Oktober 2013

Excel generieren leicht gemacht

Wer schon einmal Apache POI zur Generierung von Excel Dokumenten verwendet hat, kennt wahrscheinlich Code, der so ähnlich aussieht wie der Folgende:


Man muss also relativ viel Code schreiben um ein sehr simples Dokument zu generieren. Auch die Wartbarkeit ist nicht ganz so dolle. Jede noch so kleine Änderung sorgt dafür, dass der Code angepasst werden muss. Wenn dann noch viel mit CellStyles gearbeitet wird, hört es irgendwann ganz auf.


Vor einiger Zeit wurde mir von dem Framework jXLS erzählt, mit dem sich Excel Dokumente deutlich einfacher generieren lassen.
Javaseitig ist für das gleiche Beispiel wie oben nur noch folgender Code notwendig:


Zusätlich wird noch ein Template benötigt. Das Template ist einfach eine Excel Datei, im Beispiel shopping-list.xls. Dem Template wird eine Map übergeben. In der Map befinden sich die Objekte an denen die Informationen abgefragt werden können, die in dem Excel Dokument dargestellt werden sollen.
Das Template sieht folgendermaßen aus:



Über Expression Language kann nun auf alle Objekte zugegriffen werden, die in der Map gespeichert und an das Template übergeben wurden. Es ist möglich über Listen zu itererieren und Informationen ein- bzw. auszublenden. Hintergrundfarben, Schriftarten, -größen etc. können im Template gepflegt werden und werden dann in das generierte Dokument übernommen.
So lange sich die darzustellenden Informationen nicht ändern, sondern nur die Art und Weise wie die Daten angezeigt werden sollen, muss nur das Template angepasst werden.
Das fertige Dokument sieht das folgendermaßen aus:


Weitere Informationen findet ihr hier: http://jxls.sourceforge.net/

Der Beispielcode befindet sich hier: https://github.com/gossie/jxls-demo

Freitag, 27. September 2013

iJUG Mitgliedschaft und JavaLand Konferenz

iJUG

Die JUG Bremen ist nun Gruppenmitglied in der iJUG dem Interessenverbund der (deutschen) Java User Groups e.V.

Diese Mitgliedschaft bringt uns u.a. den Schutz eines Vereins bei Veranstaltung, gemeinsame Öffentlichkeitsarbeit und die Mitgliedschaft im JCP (Java Community Process).
Zudem unterstützt der iJUG die aktive Arbeit im Java Community Process (JCP). Mitglieder sind automatisch JCP-Mitglied unter dem gemeinsamen Dach und müssen keine separaten Verträge mit Oracle schließen. Organisierte Mitglieder müssen sich nur auf jcp.org registrieren und dem iJUG zuordnen und sind dann vollwertiges JCP-Mitglied. (Quelle: www.ijug.eu)
 Mehr über den JCP erfahrt ihr unter: http://jcp.org/en/participation/overview


Innerhalb der JUG Bremen könnt ihr der iJUG für nur 10 Euro pro Jahr beitreten und erhaltet dafür u.a. vier Ausgaben des Magazins 'Java aktuell' und könnt am JCP teilnehmen. Mitgliedsanträge können ausgefüllt bei mir abgegeben werden. Einen Antrag erhaltet ihr unter:
http://www.ijug.eu/mitgliedschaft/mitgliedschaft.html

Neue Konferenz JavaLand

Im März wird im Phantasialand in Brühl eine zweitägige deutsche Java-Konferenz, die JavaLand  stattfinden. Die Konferenz wird von der DOAG (Deutsche Oracle Anwendergruppe) und dem Heise Zeitschriftenverlag mit Unterstützung der iJUG am 25./26. März 2014 erstmalig ausgerichtet. Die Konferenz verspricht ein interessantes Programm mit deuschen und internationalen Vortragenden und dem ausprobieren der einen oder anderen Attraktion im Phantasialand.

Der Call For Paper, bei dem eigene Vorträge eingereicht werden können, läuft noch bis zum 15. Oktober. Das Programm wird kurze Zeit später bekannt gegeben.

Weitere Informationen finden sich auf der JavaLand Homepage: www.javaland.eu



Dienstag, 17. September 2013

Aktueller Stand Java 8

Hier findet ihr einen hoffentlich vollständigen Überblick über den aktuelle Stand von Java 8.

Developer Preview


Seit der letzten Woche ist eine offizielle Developer Preview für Java 8 erhältlich: https://jdk8.java.net/download.html

Es handelt sich dabei um Build 106 vom 09.09.2013 welcher von Mark Reinhold hier genauer beschrieben wird: http://mreinhold.org/blog/jdk8-preview

Diese Version enthält alle neuen Features in Java 8 und auch an den Lambda-Bibliotheken sollte sich von nun an nicht mehr viel ändern. Gestern ist dazu ein neuer State of the Lambda von Brian Goetz erschienen:
http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html
http://cr.openjdk.java.net/~briangoetz/lambda/lambda-libraries-final.html

Dort ist die Entwicklung von Lambdas für Java und die Integration in die Libraries mit Beispielen beschrieben. Dies ist auf jeden Fall einen Blick wert!

Oracle ruft offiziell dazu auf Java 8 bereits zu testen und Fehler direkt zu reporten.

Dazu ist nun sogar endlich der neue Jira Bugtracker von Oracle für Java aktiv: https://bugs.openjdk.java.net
 

Frameworks mit Java 8 testen


Das Adopt OpenJDK Projekt hat außerdem eine Wiki-Seite auf der der Status für Frameworks die mit Java 8 getestet wurden vermerkt ist: https://java.net/projects/adoptopenjdk/pages/TestingJava8

Wenn ihr ein eigenes Framework habt oder eins benutzt welches noch in der Liste fehlt, tragt es doch dort ein oder schreibt mir eine Mail wenn ihr keinen Account habt.

Auf der genannten Seite findet ihr außerdem einen Link zu https://adopt-openjdk.ci.cloudbees.com worüber ihr eure Java 8 Projekte in der Cloud auf Java 8 testen könnt. Es sind auch Anleitungen für die Einrichtung von Jenkins vorhanden.

Lambda Aufgaben


Einige von euch haben bereits an zwei abendlichen Events zur Programmierung mit Lambdas und Java 8 teilgenommen. Zu der Open Spaces Konferenz JCrete vor zwei Wochen hat Ioannis Kostaras neue spannende Aufgaben entwickelt, an denen Ihr euch gerne versuchen könnt:
https://github.com/JCrete/lambda-hackday
(Anleitung zur Einrichtung von IDEs: https://github.com/AdoptOpenJDK/lambda-tutorial)

Eclipse und Java 8


Nun zu den IDEs: Während IntelliJ und Netbeans schon seit längerem weitestgehend vollständigen Support für Java 8 bieten, hinkt Eclipse noch immer hinterher.

Hintergrund ist der eigene Java Compiler ECJ den Eclipse verwendet und der komplett selber geschrieben ist. Die umfangreichen Änderungen bedeuten für das Eclipse Team einen immensen Aufwand um den Compiler auf den aktuellen Stand zu bringen.

Mittlerweile lässt sich Java 8 Code kompilieren und auch der Content Assist ist recht fortgeschritten. Offen ist noch die Typinferenz und Auflösung von überladenen Methoden (http://wiki.eclipse.org/JDT_Core/Java8). Wenn ihr Eclipse mit Java 8 ausprobieren möchtet, könnt ihr die von Tom Schindl bereitgestellte aktuelle Luna Version von gestern verwenden:
http://downloads.efxclipse.org/eclipse-java8/2013-09-13

Noch Fragen oder Anregungen? Gerne per E-Mail an mich.

Links im Überblick



Donnerstag, 15. August 2013

W-JAX München 4.-8. November 2013

Guten Abend,

heute möchte ich gerne auf die größte deutsche Java-Konferenzen, die W-JAX in Müchen im November, hinweisen.

Ich selber wäre gerne bei der Konferenz dabei, bin jedoch beruflich verhindert.

Die Early Bird Anmeldung läuft noch bis zum 12. September und ist preislich sehr interessant.




München, 12. August 2013 – Die W-JAX lädt einmal mehr mit einem umfangreichen Programm rund um Java, Architektur, Agile, Cloud und vielem mehr nach München. Vom 4. bis 8. November präsentiert die Herbstausgabe der JAX mehr als 160 renommierte Referenten aus dem IT-Bereich mit über 180 Vorträgen. Die Teilnehmer erwarten themenspezifische Vortragsreihen – die so genannten Special Days – informative Einzelvorträge sowie ganztägige Workshops.

Mit dem Workshop-Montag startet die W-JAX am 4. November in die fünftägige Konferenzwoche. In den ganztägigen und praxisorientierten Workshops zu Themen wie Java EE 7, JFS, GIT und Hadoop arbeiten die Teilnehmer gemeinsam mit erfahrenen Trainern hands-on anhand themenrelevanter Beispiele. Auf individuelle Fragen der Teilnehmer gehen die praxiserprobten Referenten ein und geben gezielt Hilfestellungen und Ratschläge. Die Workshops rund um Continuous Delivery, Eclipse 4.x Application Platform und Spring beschließen die Konferenzwoche am Freitag (8. November). 

Die W-JAX bietet den Teilnehmern während der Konferenzwoche insgesamt mehr als 18 sogenannte Special Days. Im Rahmen der themenspezifischen Vortragsreihen erhalten die Teilnehmer die Möglichkeit, ihr Wissen in ausgewählten Kernbereichen zu vertiefen. Der Agile Day und der JavaFX 101 Day geben am Montag (4. November) den Auftakt zu den Thementagen. Der Agile Day zeigt unter anderem auf, wie sich agile Vorgehensweisen gewinnbringend in Softwareentwicklungsprojekten umsetzen lassen. Im Rahmen des JavaFX 101 Days erhalten die Teilnehmer einen allumfassenden Blick auf die UI-Technologie.

Begleitend zur Hauptkonferenz der W-JAX (5. bis 7. November) präsentieren sich innovative IT-Unternehmen auf der Konferenz-Expo, welche sowohl über Produkte als auch Lösungen im eigenen Unternehmen informieren. Das Rahmenprogramm der Konferenz bietet am Abend Networking-Events wie dem sogenannten Ballroom, der den Teilnehmern die Möglichkeit bietet, mit Referenten, Unternehmen sowie anderen Teilnehmern in Kontakt zu treten. 
Alle Informationen zur W-JAX unter: www.jax.de 

Montag, 15. Juli 2013

Fixing multiple errors with search/replace in Eclipse

This is just a short post about a nice trick which I just found out while doing big changes to several projects in eclipse.

I had some problems refactoring a class due to too many previous errors and ended up having more errors due to a method which I moved elsewhere. Replacing the method call wasn't a problem, but I needed to add the import to the new Class too.

Applying a quick fix for adding the import to all these files at the same time in the Problems view didn't work out (seems like a small bug in eclipse). But when I did a right click on the problems view table I had the 'Show In' option and selected 'Project Explorer'. This resulted in a selection of all affected files in the explorer. Next I did go to the Search->File menu and hit 'Search In: Selected Resources'.

Now it was easy to search via regular expression for 'package (.*);' and replace with '\0\R\Rimport MyNewClass;'

Sonntag, 24. März 2013

Trying out Nashorn in Eclipse


Setup


Download Java 8 EAP b82 or greater from
http://jdk8.java.net/download.html
or go to
http://java.net/projects/adoptopenjdk/pages/AdoptOpenJDK#Starter_Level
to build Java 8 from source.

Go to
https://github.com/AdoptOpenJDK/NashornHackDay
and clone the Respository (or download a zip). The directory should be named 'NashornHackDay'

Download the Java Developers edition of eclipse if you don't have it installed yet:
http://www.eclipse.org/downloads

Create an Eclipse Project

  • Run eclipse and choose a workspace
  • You might want to install the 'Javascript Development Tools': Help->Install New Software: Select Juno Update Site, check 'Group Items by Category', Scroll to 'Web,XML,..' and select the plugin
  • Create a new Java Project Nashorn

Java calling Javascript

  • Copy TestInterop.java from NashornHackDay/java-interop/simple to the src folder of your eclipse project
  • Copy script.js to the main folder of your Nashorn project
  • Go to Menu: Window->Prefernces->Java->Installed JREs
  • Add the Java 8 JDK to the installed JREs by choosing the main folder of the JDK
  • Go back to your project
  • Open the Context-Menu of the Project and go to Properties
  • Under Java-Build-Path remove the JRE Library on the Libraries Tab
  • Add the Java 8 JDK on the same TAB via Add Library->JRE System Libraries
  • Exit the Dialog
  • Try to run the TestInterop.java now.

Javascript calling Java

  • Add a new folder called script in the project Nashorn main-folder in eclipse
  • Copy the *.js scripts from the NashornHackDay/examples folder into this location
  • Create a new script nashorn.sh in the NashornHackDay directory
  • Put this into the file
 #!/bin/sh

 $JAVA8_HOME/bin/jjs <path_to>/NashornHackDay/lib/hackday/bootstrap.js $1
 

  • Where $JAVA8_HOME should point to your OpenJDK 8 build/installation.
  • Change the <path_to> to the path of your NashornHackDay directory
  • Go back to eclipse and click on the small down arrow on the button right to the Run-Button in the Toolbar
  • Open the menu entry "External Tools Configurations"
  • Click on Program in the left navigation part and open the Context Menu: New
  • Put in the Following:
Name: RunNashorn
Location: <path_to>/NashornHackday/nashorn.sh
Working Directory: ${workspace_loc:/Nashorn}
Arguments: ${selected_resource_loc}

  • Go to tab: Refresh and select 'Refresh resources upon completion' and 'The project containing the selected resource'
  • Go to tab: Build and unselect 'Build before launch'
  • Go to tab Common and select 'Display in favorites menu: External Tools'
  • 'Close' the Dialog
  • Choose a *.js file from your script-directory and open the 'External Tools' chooser from the Toolbar again and choose 'RunNashorn'
  • Eclipse will run the *.js File with Nashorn now and show the results in the Console in eclipse

JavaScript Help

If you downloaded the nashorn source as described on the GitHub page or have the source of the OpenJDK then go to the docs directory to find a
Java Scripting Programmer's Guide (JavaScriptingProgrammersGuide.html).