[解決済み] 名前付きビーンが定義されていない
質問
JUnitを使ってSpringのComponentをテストしているのですが、エラーが出ます。
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'wsVehicleService' is defined
これは私のテストクラスです。
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();
}
}
}
これは、テストされるクラスです。
@Component
public class WsVehicleService {
public List<HistoryAlarmInfo> getHistoryAlarmInfo(String requestJson) {
try {
return getHistoryAlarmInfoImpl(requestJson);
} catch (Exception e) {
log.error(e);
return null;
}
}
}
JUnitがgetBeanを実行すると、エラーが発生する。
No bean named 'wsVehicleService' is defined
.
どこが悪いのか、どうすれば正しくなるのか。
試してみたこと
追加
@ComponentScan("com.zw.ws.*")
をクリックして、WsVehicleService クラスをスキャンします。
これはログです。
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:これはXML構成ではなく、すべてのビーンがオートスキャンを使用しています。
解決方法は?
1)最初の解決策
@ContextConfiguration
は Spring のコンテキストを初期化し、デフォルトではユニットテストと同じパッケージで、クラスと同じファイル名に '-context.xml' を接尾辞としてつけた Spring XML ファイルを探します。
の中に WsVehicleServiceTest-context.xml ファイルを追加してみてください。
com.mycompany.annotation
パッケージを使用します。
<?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.xsd">
<bean id="wsVehicleService"
class="com.mycompany.annotation.WsVehicleService">
</bean>
</beans>
("classpath:/*.xml") を削除した後の Junit テストクラスです。
package com.mycompany.annotation;
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.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class WsVehicleServiceTest {
@Autowired
ApplicationContext ctx;
@Test
public void getHistoryAlarmInfo() throws Exception {
try {
WsVehicleService vehicleService = (WsVehicleService) ctx
.getBean("wsVehicleService");
String hi = vehicleService.sayHi();
System.out.println(hi);
} catch (BeansException e) {
e.printStackTrace();
}
}
}
注
を使用したい場合は
@ContextConfiguration("classpath:/*.xml")
を必ず入れてください。
<bean id="wsVehicleService"
class="com.mycompany.annotation.WsVehicleService">
</bean>
を *.xml ファイルのいずれかに記述してください。
2) 第二の解決策
必ず
<context:annotation-config />
を xml ファイルに追加します。ここでは、xml ファイルで wsVehicleService ビーンを宣言する必要はありません。
テストクラスを修正するには
@Autowired
で
WsVehicleService
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/*.xml")
public class WsVehicleServiceTest {
@Autowired
ApplicationContext ctx;
@Autowired
WsVehicleService wsVehicleService;
@Test
public void getHistoryAlarmInfo() throws Exception {
try {
String hi = wsVehicleService.sayHi();
System.out.println(hi);
} catch (BeansException e) {
e.printStackTrace();
}
}
}
3)第3の解決策
あなたは、xml 設定ファイルを使用しておらず、あなたの例外が
org.springframework.beans.factory.NoSuchBeanDefinitionException
WsVehicleServiceがコンテキストに存在しない理由の1つは、Springによってスキャンされないパッケージで定義されている可能性があることです。
WsVehicleServiceが以下の場所に存在することを確認してください。
@ComponentScan("com.mycompany.annotation")
パッケージを使用します。
1) アノテーション付きアプリケーション設定クラス コンフィギュレーション
package com.mycompany.annotation;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.mycompany.annotation")
public class AppConfig {
}
2) サービスクラス
package com.mycompany.annotation;
import org.springframework.stereotype.Component;
@Component
public class WsVehicleService {
public String sayHi(){
return "HI !!!!!!!!!!";
}
}
3)Junitテストクラス
package com.mycompany.annotation;
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.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class WsVehicleServiceTest {
@Autowired
ApplicationContext ctx;
@Test
public void getHistoryAlarmInfo() throws Exception {
try {
WsVehicleService vehicleService = (WsVehicleService) ctx
.getBean("wsVehicleService");
String hi = vehicleService.sayHi();
System.out.println(hi);
} catch (BeansException e) {
e.printStackTrace();
}
}
}
OUTPUTです。
HI !!!!!!!!!!
その他のリファレンス NoSuchBeanDefinitionExceptionの原因と対処法
関連
-
[解決済み] ApplicationContext(アノテーション付き)の読み込みに失敗しました。
-
[解決済み] tempとは何ですか、またjavaにおけるtempの用途は何ですか?
-
[解決済み] enumのordinalを使用するのは良い習慣ですか?
-
[解決済み] コレクションへの共有参照が見つかりました org.hibernate.HibernateException
-
[解決済み] Cloneable throws CloneNotSupportedException
-
[解決済み] java.util.concurrent.ExecutionException 例外をどのように処理しますか?
-
[解決済み] javacが「using unchecked or unsafe operations」という警告を出す原因は何ですか?
-
[解決済み] mavenのコンパイルに失敗するのはなぜですか?
-
[解決済み] Mavenです。JARは空になります - 含有するためにマークされたコンテンツがありません
-
[解決済み] 文字列の巻き方
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] トークンのシンタックスエラー、これらのトークンを削除してください [closed].
-
[解決済み] java.sql.SQLException: ORA-00933: SQL コマンドが正しく終了していません。
-
[解決済み] Jdbctemplate の文字列に対するクエリです。EmptyResultDataAccessException: 不正な結果サイズ:期待値1、実際0
-
[解決済み] Java - JTextFieldが空かどうかを確認する
-
[解決済み] Java の substring() の時間複雑性
-
[解決済み] Cloneable throws CloneNotSupportedException
-
[解決済み] javac ソースファイルが見つかりません
-
[解決済み] javascriptでExpression言語を使うには?
-
[解決済み] 1行目2列目でBEGIN_ARRAYを期待したが、BEGIN_OBJECTだった。
-
[解決済み] 文字列の長さに応じて文字列をトリミングする