Wie viele Tests sollte meine Software haben?

29. April 2010

Eine gute Frage: „Wie viele Tests sollte meine Software haben?“ mit einer noch besseren Antwort: „Test until fear turns to boredom.“ (Quelle: JUnit FAQ).

Was hinter diesem Satz steckt ist folgender Gedanke: Unit-Tests (oder auch Tests im Allgemeinen) sollen die Furcht reduzieren, dass etwas „schiefgehen“ könnte. Wenn also die Furcht nicht mehr vorhanden ist und stattdessen Langeweile auftaucht, hat man dieses Ziel wohl offensichtlich erreicht.

Änderungen am Class Dateiformat durch Java 5

25. April 2010

Java ist ja nicht nur eine Programmiersprache, sondern bringt auch eine virtuelle Maschine mit sich. Seit Java 5 gibt es aber eine Reihe von Erweiterungen. Dazu gehören unter Anderem Generics und Annotations.

Die Beschreibungen von Generics und Annotations beziehen sich - verständlicher Weise - oft auf die Programmiersprache selber. Doch was hat sich aus Sicht der virtuellen Maschine getan? Was wurde an der Struktur der Class Dateien geändert? Generics und Annotations können beide über die Reflection API zur Laufzeit ausgewertet werden. Das bedeutet, dass sie in den Class Dateien enthalten sein müssen.

Wenn man nach den Java Spezifikationen sucht, so kommt man recht schnell zur Java Language Specification. Diese definiert jedoch nicht die Struktur der Class Dateien. Sucht man weiter so kommt man zu der Java Virtual Machine Specification. Diese liegt zurzeit in der zweiten Edition vor.

Doch wenn man sich dort das Kapitel The class File Format anschaut, dann findet man nichts über Annotations oder Generics.

Was nun?
Es existiert eine Changes for JDK 1.5 Seite, welche auf das das interessante Dokument namens revisions to „The class File Format“ verlinkt. Hier ist nun alles erklärt. Die Änderungen sind mit einem schwarzen Balken auf der linken Seite gekennzeichnet.

Noch besser sind die Zusammenhänge jedoch in der ASM User Guide erklärt. In Kapitel 4 Seite 67 sind sogar Beispiele für die Signatur von Generics enthalten.

JDepend funktioniert nicht vollständig mit Java ab Version 5

22. April 2010

JDepend ist ein beliebtes und oft genutztes Tool. Unter Anderem um zyklische Abhängigkeiten auf Paketebene innerhalb einer Java Software zu finden. Diese zyklischen Abhängigkeiten möchte man aus prinzipiellen softwarearchitektonischen Überlegungen heraus vermeiden. Für JDepend gibt es unter Anderem Eclipse, Maven und ANT Plugins.

Mit Version 5 wurden bei Java jedoch Annotations und Generics eingeführt. Diese werden leider bei der Auswertung mit JDepend nicht berücksichtigt.

Um dieses zu zeigen habe ich folgende Klasse geschrieben. Sie benutzt in Zeile 10 eine Annotation aus dem Paket javax.xml.ws und in Zeile 8 Generics aus dem Paket java.sql.

import java.io.File;
import java.io.Serializable;
import java.sql.Blob;
import java.util.Date;

import javax.xml.ws.Action;

public class ClassWithMethodAnnotationAndGenerics<T extends Blob> {

    @Action
    public File[][] doSomething(Serializable s, Date d) {
        return null;
    }

}

Bei der JDepend Auswertung werden aber leider nur die drei Pakete java.util, java.io und java.lang gefunden (java.lang deshalb weil die Klasse ja von java.lang.Object erbt).

Wenn man bedenkt, dass nicht einmal die Apache Byte Code Engineering Library (BCEL) Annotations und Generics unterstützt erscheint das Ganze nicht so schlimm - aber dennoch ist es schade. Vielleicht sollte ich selber mal ein JDepend 2.0 mit Hilfe von ASM schreiben.