L'instanciation d'objets lors de l'utilisation de Printemps, pour les essais vs production
Suis correct dans la compréhension que lors de l'utilisation de Printemps, vous devez utiliser le Printemps de configuration xml pour instancier des objets pour la production, et directement instancier des objets lors de l'essai?
Par exemple.
MyMain.java
package org.world.hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyMain {
private Room room;
public static void speak(String str)
{
System.out.println(str);
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
Room room = (Room) context.getBean("myRoom");
speak(room.generatePoem());
}
}
Room.java
package org.world.hello;
public class Room {
private BottleCounter bottleCounter;
private int numBottles;
public String generatePoem()
{
String str = "";
for (int i = numBottles; i>=0; i--)
{
str = str + bottleCounter.countBottle(i) + "\n";
}
return str;
}
public BottleCounter getBottleCounter() {
return bottleCounter;
}
public void setBottleCounter(BottleCounter bottleCounter) {
this.bottleCounter = bottleCounter;
}
public int getNumBottles() {
return numBottles;
}
public void setNumBottles(int numBottles) {
this.numBottles = numBottles;
}
}
BottleCounter.java
package org.world.hello;
public class BottleCounter {
public String countBottle(int i)
{
return i + " bottles of beer on the wall" + i + " bottles of beer!";
}
}
Beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="myRoom" class="org.world.hello.Room">
<property name="bottleCounter">
<bean id = "myBottleCounter" class = "org.world.hello.BottleCounter"/>
</property>
<property name = "numBottles" value = "10"></property>
</bean>
</beans>
Sorties: (toutes mes excuses pour le manque d'espace)
10 bottles of beer on the wall10 bottles of beer!
9 bottles of beer on the wall9 bottles of beer!
8 bottles of beer on the wall8 bottles of beer!
7 bottles of beer on the wall7 bottles of beer!
6 bottles of beer on the wall6 bottles of beer!
5 bottles of beer on the wall5 bottles of beer!
4 bottles of beer on the wall4 bottles of beer!
3 bottles of beer on the wall3 bottles of beer!
2 bottles of beer on the wall2 bottles of beer!
1 bottles of beer on the wall1 bottles of beer!
0 bottles of beer on the wall0 bottles of beer!
Maintenant pour tester ceci:
BottleCounterTest.java:
package org.world.hello;
import static org.junit.Assert.*;
import org.junit.Test;
public class BottleCounterTest {
@Test
public void testOneBottle() {
BottleCounter b = new BottleCounter();
assertEquals("1 bottles of beer on the wall1 bottles of beer!", b.countBottle(1));
}
}
Assez simple.
RoomTest.java:
package org.world.hello;
import static org.junit.Assert.*;
import org.mockito.Mockito;
import org.junit.Test;
public class RoomTest {
@Test
public void testThreeBottlesAreSeperatedByNewLines()
{
Room r = new Room();
BottleCounter b = Mockito.mock(BottleCounter.class);
Mockito.when(b.countBottle(Mockito.anyInt())).thenReturn("a");
r.setBottleCounter(b);
r.setNumBottles(3);
assertEquals("a\na\na\na\n", r.generatePoem());
}
}
Suis-je correct dans l'instanciation de mes objets de test de cette façon?
Ce n'est pas correct. Vous devez injecter des instances de l'objet même des fins de test. Voir @Waheed la réponse ci-dessous. Si vous voulez différent (ou différemment initialisé) les instances d'un objet d'essai et de production, vous devez utiliser Printemps des Profils.
Voici une question:stackoverflow.com/questions/29224579/...
Si vous êtes à la création d'objets à l'aide
Voici une question:stackoverflow.com/questions/29224579/...
Si vous êtes à la création d'objets à l'aide
new
, alors comment pouvez-vous gérer les dépendances, si votre Room
objet a une dépendance sur Door
objet, alors vous avez besoin Door
ainsi de tester Room
correctement sinon vous allez courir dans des NPE. Si vous essayez de créer toutes les dépendances à l'aide de new
, alors vous avez besoin pour créer l'ensemble de la chaîne de dépendances par vous-même ce qui n'est pas un moyen idéal de le faire. Mais plutôt que de tracas, de l'utilisation Mockito est mock()
pour obtenir une procuration de vos dépendances et puis faire usage de when-thenReturn
OriginalL'auteur dwjohnston | 2015-03-23
Vous devez vous connecter pour publier un commentaire.
Intérieure statique de la classe de configuration:
Lors de l'essai de Printemps composants que nous utilisons habituellement
@RunWith(SpringJUnit4ClassRunner.class)
et faire de notre classe@ContextConfiguration
. En faisant de la classe@ContextConfiguration
vous pouvez créer un intérieur de classe statique pour la configuration et le fait que vous avez le plein contrôle. Il vous définissez tous vous avez besoin que les haricots et les@Autowired
dans votre test, ainsi que les dépendances qui peuvent être des simulacres ou des objets, en fonction du cas de test.Composant de balayage de code de production:
Si il y a plus de composants nécessaires pour la tester, vous pouvez ajouter
@ComponentScan
mais nous essayons de le faire analyser uniquement les paquets dont il a besoin (c'est lorsque vous utilisez@Component
annotation, mais dans votre cas, vous pouvez ajouter XML pour@ContextConfiguration
). C'est un bon choix lorsque vous n'avez pas besoin de se moque et que vous avez une installation compliquée qui doit être la production comme. C'est bon pour les tests d'intégration où vous voulez tester la façon dont les composants interagissent les uns avec les autres fonctionnelle tranches que vous voulez tester.Approche hybride: C'est le cas d'habitude quand vous avez beaucoup de haricots, qui doivent être de production comme, mais un ou deux doivent être des simulacres. Ensuite, vous pouvez
@ComponentScan
code de production, mais aussi ajouter une inner classe statique qui est@Configuration
et y définir les haricots avec l'annotation@Primary
qui remplacera la production de code de configuration pour que les haricots dans le cas de tests. C'est bon puisque vous n'avez pas besoin d'écrire de longues@Configuration
avec tous les haricots, vous analysez ce que vous avez besoin et remplacer ce qui devrait être une fantaisie.Dans votre cas, je aller avec la première approche comme ceci:
@ContextConfiguration
sera toujours instancier les haricots de vousbeans.xml
mais il vous permet en plus de les écrire avec le@Configuration
?Le problème que je vais avoir avec cette solution, c'est ceci: stackoverflow.com/questions/29641084/...
@ContextConfiguration
indique où votre configuration. Vous pouvez spécifier le format xml en ajoutantlocations
ou java config en spécifiantclasses
mais pas les deux. Si vous ne spécifiez rien, il va ramasser intérieure statique@Configuration
classe seulement. Vous pouvez ajouter@Import
avec l'emplacement des vous fichier xml à l'intérieur de configuration statique de la classe. Pour combiner xml et java de configuration vous pouvez consulter docs.printemps.io/printemps-javaconfig/docs/1.0.0.M4/de référence/html/...OriginalL'auteur Nenad Bozic
En général, lorsque vous souhaitez créer une unité de test, vous devez avoir à l'esprit :
Vous avez besoin de tester le code de l'objet réel, cela signifie que la classe que vous voulez de test de l'unité doivent être un véritable exemple, il n'est pas idéal à l'aide de l'opérateur new, comme vous avez probablement quelques dépendances à l'objet et à l'aide du constructeur n'est pas toujours la meilleure solution. Mais vous pouvez utiliser quelque chose comme cela.
Toutes les variables qui sont d'un autre objet (aka. en tant que dépendances) doivent être l'objet de moqueries, l'une de vous a-les relations ont besoin d'être remplacer par un objet Fantaisie et tous les appels aux méthodes de ce moqué de l'objet devrait se moque de lui en tant que bien à l'aide de
Mockito.when
Si vous utilisez
Vous appelez votre vrai haricots et qui ne sera pas un test unitaire, il sera plus comme des tests d'intégration. Dans l'exemple que vous écrivez dans votre question, de mon point de vue, le test doit être effectué que:
OriginalL'auteur Koitoer
Je suppose, ce n'est pas la bonne façon de tests Junit dans le Printemps de la création de la Salle de l'objet en utilisant le nouveau mot-clé dans votre RoomTest.java .
Vous pouvez utiliser le même fichier de configuration, j'.e Beans.xml fichier pour créer bean cours de test Junit cas.
Printemps
@RunWith
et@ContextConfiguration
pour effectuer la tâche ci-dessus. Vérifier ici pour plus de détails explication.La page est manquant un peu de code? Environ à mi-chemin là-bas est un extrait de montrer ce qui est dans spring-config.xml mais on dirait qu'il manque le plus.
^ c'est - vous pouvez trouver le texte complet sur le github ici github.com/codesolid/tutorials
Cette section de la documentation pour vous aider à JDBC essais connexes - docs.printemps.io/printemps/docs/en cours/printemps-cadre de la référence/...
Salut! Le lien fourni dans cette réponse ne semble pas être plus précis. Pouvez-vous résoudre ce problème? Merci beaucoup, André
OriginalL'auteur Waheed
Dans mon oppinion
Dependency Injectio
devriez faire de votre code moins dépendants sur le récipient qu'il serait traditionnels avec le développement Java EE.Le Pojo qui composent votre application doit être testée dans JUnit ou TestNG tests, avec des objets simplement instancié à l'aide de l'opérateur new, sans Ressort ou tout autre récipient.
Par exemple:
OriginalL'auteur jfcorugedo
D'abord une réponse
Vous devez exécuter votre test avec un Ressort de lanceur de test, à l'aide d'un test contexte spécifique
Laissez Printemps instancier votre bean, mais d'adapter votre test contexte spécifique de sorte qu'il exclut tous les haricots que vous n'avez pas besoin à l'intérieur d'un test, ou une maquette de suite les choses que vous ne voulez pas tester (par exemple, votre
BottleCounter
), mais ne peut pas exclureet une autre note, dans la production, vous aurez plus de chances de finir avec annoté les haricots qui sont captés par le printemps basé sur la numérisation du classpath pour annoté classes que s'opposer à la déclaration de tous en xml. Dans cette configuration, vous pouvez toujours se moquer de vos haricots avec une aide de
context:exclude-filter
, quelque chose commePlus au sujet de votre dilemme
À mon avis vous avez défini le contexte d'un dilemme faux. Quand vous dites ai-je raison de comprendre que lors de l'utilisation de Printemps, vous devez utiliser le Printemps de configuration xml pour instancier des objets pour la production, et directement instancier des objets lors de l'essai de. Il ne peut y avoir qu'une seule réponse, oui, vous avez tort, parce que ce n'est pas lié à de Printemps à tous.
Le contexte où votre dilemme est valide, c'est quand vous avez raison à propos de l'intégration vs tests unitaires. En particulier, si vous définissez l'unité de test est le test d'un composant individuel avec tout le reste (y compris les dépendances à d'autres haricots) être moqué ou supprimée loin. Donc, si votre intention est d'écrire le test de l'unité selon cette définition, votre code est tout à fait normal, et même souhaitable cause par l'instanciation de l'objet directement, pas de cadre sera en mesure d'injecter automatiquement ses dépendances. Selon cette définition printemps tests sont des tests d'intégration, et c'est ce que @Koitoer mentionne dans sa réponse quand il dit , Vous appelez votre vrai haricots et qui ne sera pas un test unitaire, il sera plus comme des tests d'intégration
Dans la pratique, les gens ne sont généralement pas concernés à propos de la distinction. Le printemps se réfère à son test de tests unitaires. Le cas le plus courant est ce que @Nenad Bozic appelle une approche hybride, où vous voulez ot se moquer un peu de l'objet, par exemple de connexion à une base de données ou similaires, et sur la base de certains de vos commentaires c'est ce que vous avez besoin.
OriginalL'auteur Master Slave