Favoriten für Static Imports in Eclipse definieren

veröffentlicht am 20. April 2013

Seit Java 1.5 ist es möglich, Static Imports zu verwenden. Mit der Technik können statische Methoden und Werte einer Klasse so importiert werden, dass eine Angabe des vollqualifizierten Pfades nicht mehr nötig ist. Die Einführung dieser Möglichkeit wurde zwiespaltig betrachtet. Nicht umsonst heißt es in der offiziellen Dokumentation: So when should you use static import? Very sparingly! Doch in einigen Fällen können Static Imports wirklich hilfreich sein. Dieser Artikel zeigt ein sinnvolles Einsatzszenario und schildert, wie man häufig genutzte Static Imports in Eclipse als Favoriten eintragen kann.

Einsatzbereich: Softwaretests

Ich persönlich nutze Static Imports gerne im Zusammenspiel mit JUnit und Mockito da der Quellcode der Softwaretests kompakter und lesbarer wird. Für mein Beispiel wird ein einfacher Service erstellt, der das Durchschnittsalter der Benutzer berechnen soll. Das Beispiel ist so kompakt wie möglich gehalten, deshalb besitzt der Benutzer einfach nur ein Alter:

public class User {

	private final int age;

	public User(final int age) {
		this.age = age;
	}

	public int getAge() {
		return age;
	}

}

Auch das UserDAO kommt hier ohne Interface aus und liefert immer 10 Benutzer mit Zufallsalter:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class UserDAO {

	public List getUsers() {
		final Random random = new Random();
		final List users = new ArrayList<>();
		for (int i = 0; i < 10; i++) {
			final User user = new User(random.nextInt());
			users.add(user);
		}
		return users;
	}

}

Zuletzt der minimalistische Service, der gleich getestet werden soll:

import java.util.List;

public class StatisticService {

	private final UserDAO userDAO;

	public StatisticService(final UserDAO userDAO) {
		this.userDAO = userDAO;
	}

	public int getAverageUserAge() {
		final List users = userDAO.getUsers();
		final int totalUsers = users.size();
		int ageSum = 0;
		for (final User user : users) {
			ageSum += user.getAge();
		}
		return ageSum / totalUsers;
	}

}

Damit der Service isoliert getestet werden kann, wird das UserDAO zunächst gemockt. Das Mock-Objekt wird für den Test immer gleich bleibende Werte zurück liefern, sodass das erwartete Ergebnis des Service vorhersagbar ist. Der Test sieht nun ohne Static Imports wie folgt aus:

import java.util.ArrayList;
import java.util.List;

import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;

public class StatisticServiceTest {

	@Test
	public void testGetAverageUserAge() {

		final List users = new ArrayList<>();
		users.add(new User(24));
		users.add(new User(37));
		users.add(new User(18));

		final UserDAO userDAOMock = Mockito.mock(UserDAO.class);
		Mockito.when(userDAOMock.getUsers()).thenReturn(users);

		final StatisticService service = new StatisticService(userDAOMock);
		final int averageUserAge = service.getAverageUserAge();

		final int expectedAverageUserAge = 26;
		Assert.assertEquals(averageUserAge, expectedAverageUserAge);

	}

}

Mit Static Imports (oben den imports Abschnitt achten) wird der Test ein wenig kompakter:

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

public class StatisticServiceTest {

	@Test
	public void testGetAverageUserAge() {

		final List users = new ArrayList<>();
		users.add(new User(24));
		users.add(new User(37));
		users.add(new User(18));

		final UserDAO userDAOMock = mock(UserDAO.class);
		when(userDAOMock.getUsers()).thenReturn(users);

		final StatisticService service = new StatisticService(userDAOMock);
		final int averageUserAge = service.getAverageUserAge();

		final int expectedAverageUserAge = 26;
		assertEquals(averageUserAge, expectedAverageUserAge);

	}

}

Zugegeben, bei diesem Test fallen die Static Imports nur unwesentlich ins Gewicht. Bei komplexen Tests, profitiert die Lesbarkeit jedoch enorm.

Static Import Favoriten einrichten

Damit häufig verwendete Static Imports nicht immer von Hand eingetragen werden müssen, bietet Eclipse die Möglichkeit, Favoriten für Static Imports einzutragen. Öffne hierzu die Eclipse Einstellungen und navigiere zu Java → Editor → Content Assist → Favorites. Um alle statischen Eigenschaften einer Klasse als Favorit einzutragen, klickt man auf New Type… und gibt den vollqualifizierten Klassenpfad ein (z.B. org.junit.Assert). Um nur eine bestimmte Methode oder Eigenschaft einer Klasse einzutragen, wählt man New Member… und gibt den vollqualifizierten Klassenpfad gefolgt von der Methode oder der Eigenschaft ein (z.B. org.mockito.Mockito.when):

Static Import Favorites
Sobald der Favorit eingetragen ist, kann nun der Anfang eines Static Imports im Quellcode eingegeben und dann per Code-Vervollständigung komplettiert werden, wobei auch gleich der Static Import hinzugefügt wird.

Quellen und weiterführende Links

Hinterlasse einen Kommentar