Ich programmiere in einer Java SE-Umgebung mit WELD-SE für Abhängigkeitsinjektion. Deshalb Abhängigkeiten einer Klasse wie folgt aussehen:Wie injiziert Mocks beim Testen von Klassen mit CDI in der Produktion
public class ProductionCodeClass {
@Inject
private DependencyClass dependency;
}
Wenn eine Unit-Test für diese Klasse zu schreiben ich für DependencyClass
ein Mock bin die Schaffung und wie ich will keine vollständige CDI-Umgebung für jeden Test starten Ich betreibe ich das Mock „injizieren“ manuell:
import static TestSupport.setField;
import static org.mockito.Mockito.*;
public class ProductionCodeClassTest {
@Before
public void setUp() {
mockedDependency = mock(DependencyClass.class);
testedInstance = new ProductionCodeClass();
setField(testedInstance, "dependency", mockedDependency);
}
}
die statisch importierte Methode setField()
ich mich mit Werkzeugen in einer Klasse geschrieben habe ich in Tests verwenden:
public class TestSupport {
public static void setField(
final Object instance,
final String field,
final Object value) {
try {
for (Class classIterator = instance.getClass();
classIterator != null;
classIterator = classIterator.getSuperclass()) {
try {
final Field declaredField =
classIterator.getDeclaredField(field);
declaredField.setAccessible(true);
declaredField.set(instance, value);
return;
} catch (final NoSuchFieldException nsfe) {
// ignored, we'll try the parent
}
}
throw new NoSuchFieldException(
String.format(
"Field '%s' not found in %s",
field,
instance));
} catch (final RuntimeException re) {
throw re;
} catch (final Exception ex) {
throw new RuntimeException(ex);
}
}
}
Was mir an dieser Lösung nicht gefällt, ist, dass ich diesen Helfer in jedem neuen Projekt immer wieder brauche. Ich habe es bereits als Maven-Projekt gepackt, das ich als Testabhängigkeit zu meinen Projekten hinzufügen kann.
Aber ist nicht etwas fertig gemacht in einer anderen gemeinsamen Bibliothek fehlt mir? Irgendwelche Kommentare zu meiner Art, dies generell zu tun?
Konstruktorinjektion verwenden. – chrylis