Comment injecter se moque de tout tester des classes à l'aide de CDI dans la production

Je suis de la programmation dans un environnement Java SE à l'aide de SOUDURE-SE pour l'injection de dépendances. Par conséquent, les dépendances d'une classe de ressembler à quelque chose comme ceci:

public class ProductionCodeClass {
    @Inject
    private DependencyClass dependency;
}

Lors de l'écriture d'un test unitaire pour cette classe, je suis la création d'une maquette pour DependencyClass et comme je ne veux pas commencer un complet CDI environnement pour tous les test que j'ai menés, j' "injecter" la maquette manuellement:

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);
    }
}

La statiquement importés méthode setField() j'ai écrit moi-même dans une classe avec des outils que j'utilise en test:

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);
        }
    }
}

Ce que je n'aime pas à propos de cette solution est que j'ai besoin de cette aide dans tout nouveau projet. J'ai déjà emballé comme un projet Maven j'ai ajouté un test de dépendance à mes projets.

Mais n'est-ce pas là quelque chose de prêt dans plusieurs autres communes de la bibliothèque, je suis absent? Tous les commentaires sur ma façon de faire en général?

Utilisation du constructeur d'injection.

OriginalL'auteur Matthias Wimmer | 2015-09-06