Pas de bean nommé est défini
Je suis en utilisant JUnit pour tester le Composant de Printemps,déclenche une erreur:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'wsVehicleService' is defined
C'est ma classe de test:
package com.zw.ws.service.impl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/*.xml")
public class WsVehicleServiceTest {
@Autowired
ApplicationContext ctx;
@Test
public void getHistoryAlarmInfo() throws Exception {
try {
String requestJson = "\"{\"VEHICLEID\":\"cae21196-cb66-4256-88a6-7cdfb23e2c78\",\"STARTTIME\":1476115200,\"ENDTIME\":1476201599,\"TYPE\":1}\"";
WsVehicleService vehicleService = (WsVehicleService) ctx.getBean("wsVehicleService");
vehicleService.getHistoryAlarmInfoImpl(requestJson);
} catch (BeansException e) {
e.printStackTrace();
}
}
}
C'est la classe d'être testé:
@Component
public class WsVehicleService {
public List<HistoryAlarmInfo> getHistoryAlarmInfo(String requestJson) {
try {
return getHistoryAlarmInfoImpl(requestJson);
} catch (Exception e) {
log.error(e);
return null;
}
}
}
Quand JUnit exécuter à getBean,déclenche une erreur:No bean named 'wsVehicleService' is defined
.
Où est le mal?Que pourrais-je faire pour bien le faire?
Ce que j'ai d'avoir essayé:
ajouter @ComponentScan("com.zw.ws.*")
pour analyser les WsVehicleService classe.
C'est le journal:
12:53:11.098]-[main]-[org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener]-{After test method: context [DefaultTestContext@58783f6c testClass = WsVehicleServiceTest, testInstance = com.zw.ws.service.impl.WsVehicleServiceTest@7577b641, testMethod = getHistoryAlarmInfo@WsVehicleServiceTest, testException = org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'wsVehicleService' is defined, mergedContextConfiguration = [MergedContextConfiguration@3a7b503d testClass = WsVehicleServiceTest, locations = '{classpath:/*.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]], class annotated with @DirtiesContext [false] with mode [null], method annotated with @DirtiesContext [false] with mode [null].}
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'wsVehicleService' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:698)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1175)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1054)
at com.zw.ws.service.impl.WsVehicleServiceTest.getHistoryAlarmInfo(WsVehicleServiceTest.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:254)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:253)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
12:53:11.107]-[main]-[org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener]-{After test class: context [DefaultTestContext@58783f6c testClass = WsVehicleServiceTest, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [MergedContextConfiguration@3a7b503d testClass = WsVehicleServiceTest, locations = '{classpath:/*.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]], class annotated with @DirtiesContext [false] with mode [null].}
PS:Ce n'est pas de configuration XML,tous les haricots sont à l'aide de la fonction autoscan.
@ComponentScan
doivent être ajoutés à votre classe de test!- S'il vous plaît Montrer votre XML configruration et ajouter les noms de package
- Jetez un oeil dans ma réponse et laissez-moi savoir si cela fonctionne pour vous.
- Il ne travaille pas en ce moment,mais je vais continuer d'essayer. J'ai déjà essayé toute façon, selon la réponse,parce que c'est un projet de travail, et la configuration est un peu complexe.
Vous devez vous connecter pour publier un commentaire.
1)Première Solution:
@ContextConfiguration
initialise le Printemps contexte et, par défaut, recherche un Printemps de fichier XML dans le même package que le test de l'unité avec le nom de fichier le même que celui de la classe avec "- context.xml " comme suffixeEssayez d'ajouter la WsVehicleServiceTest-context.xml fichier dans
com.mycompany.annotation
paquet.De la classe de test Junit après le retrait ("classpath:/*.xml"):
Remarque: Si vous souhaitez utiliser
@ContextConfiguration("classpath:/*.xml")
assurez-vous de mettredans l'un de vos *.fichier xml
2) Deuxième Solution:
Assurez-vous de mettre
<context:annotation-config />
dans votre fichier xml. Ici, vous n'avez pas besoin de déclarer la wsVehicleService bean dans le fichier xml.Modifier votre classe de test en utilisant
@Autowired
surWsVehicleService
3) la Troisième solution:
Vous l'avez mentionné, vous n'utilisez pas de fichiers de configuration xml et vos exception raconte
org.springframework.beans.factory.NoSuchBeanDefinitionException
L'une des raisons de votre WsVehicleService ne peut pas exister dans le contexte – c'est qu'elle peut être définie dans un paquet qui n'est pas analysé par le Printemps.
Assurez-vous que votre WsVehicleService existent dans
@ComponentScan("com.mycompany.annotation")
paquet.1) configuration de l'Application de la classe avec l'annotation @Configuration
2) Votre classe de service
3)de la classe de test Junit
De SORTIE:
Pour plus d'info, vous pouvez consulter cette et cette
Plus de référence pour des causes et des solutions possibles pour NoSuchBeanDefinitionException
Changement de ligne
ou
"Pas de bean nommé" xxx "est défini" est levée lors de l':
Puisque vous n'avez pas changé le nom par défaut de la fève, alors que le haricot n'est pas correctement chargé.
Vous devez indiquer où sont vos composants à analyser (xml de config ou @classe de Configuration) et être chargé lors de l'exécution de vos tests.
Je voudrais créer une config classe, puis ajouter cette nouvelle config classe dans le ContextConfiguration annotation (ou d'utiliser le format xml si vous préférez).
Votre classe de test alors:
Vous pouvez également anotate avec
@Autowire
votre service et laissez Printemps faire le câblage de travail.Printemps Annotation de code
modifier en fonction de votre basepackage