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?
OriginalL'auteur Matthias Wimmer | 2015-09-06
Vous devez vous connecter pour publier un commentaire.
Mockito prend en charge cette sortie de la boîte:
La
@InjectMocks
annotation va déclencher l'injection de classes ou interfaces se moquaient dans la classe de test, dans ce casDependencyClass
:Ici, je suis également à l'aide de la
@Mock
annotation au lieu de l'appelermock()
. Vous pouvez toujours utilisermock()
, mais je préfère utiliser les annotations.Comme une note de côté, il existe des outils de réflexion disponible, qui prend en charge les fonctionnalités dont vous avez mis en œuvre dans
TestSupport
. Un exemple estReflectionTestUtils
.Peut-être mieux encore est d'utiliser constructeur injection:
Le principal avantage ici est qu'il est clair que les classes de la classe dépend, et qu'il ne peut pas facilement être construit sans fournir toutes les dépendances. Aussi, il permet l'injection de la classe finale.
En faisant cela,
@InjectMocks
n'est pas nécessaire. Au lieu de cela, il suffit de créer la classe en fournissant la maquette comme un paramètre du constructeur:Avez-vous envisagé d'ajouter des
@RunWith(MockitoJUnitRunner.class)
ou@Rule public MockitoRule rule ...
de votre code afin de le rendre complet?Le code est complet.
@RunWith(MockitoJUnitRunner.class)
serait une alternative. Cependant, cette réponse explique OP:s, la question n'est pas de poser des alternatives sur la façon d'exécuter une mockito base de test JUnit.Ah, ok. Je suppose que Mockito doit être invoquée de manière plus explicite. Merci pour la réponse.
OriginalL'auteur Magnilex
Alternative quand mockitos construire dans les fonctions ne suffisent pas: il faut Essayer needle4j.org
C'est une injection/maquette cadre qui permet l'injection de simulacres et des cas concrets et prend également en charge postConstruct pour la simulation du cycle de vie.
Eh bien, il y a quelques exemples basés sur 2.2, mais nous n'avons pas les faire migrer vers 2.3 jusqu'à présent. Mais il pourrait être utile: github.com/needle4j/needle/tree/master/src/examples
OriginalL'auteur Jan Galinski