Spring BootおよびSpring Boot JPAを使用してコンポーネントを作成しています。私はこのような設定をしています:
インターフェース:
_public interface Something {
// method definitions
}
_
実装:
_@Component
public class SomethingImpl implements Something {
// implementation
}
_
これで、_SpringJUnit4ClassRunner
_で実行するJUnitテストができました。これを使用してSomethingImpl
をテストしたいと思います。
私がする時
_@Autowired
private Something _something;
_
動作しますが、
_@Autowired
private SomethingImpl _something;
_
テストが失敗し、メッセージNo qualifying bean of type [com.example.SomethingImpl] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
とともにNoSuchBeanDefinitionException
がスローされます
ただし、テストケースでは、テストしたいクラスなので、明示的にSomethingImpl
を挿入します。どうすればこれを達成できますか?
特別なBeanが必要な場合は、@Qualifier
アノテーションを使用する必要があります。
@Autowired
@Qualifier("SomethingImpl")
private Something _something;
@Serviceを実装クラスに追加する必要があると思います。
@Service public class SomethingImpl implements Something { // implementation }
javax.inject
スタイルのDIでも同じことができると思いました。
@Named("myConcreteThing")
public class SomethingImpl implements Something { ... }
それを注入したい場所:
@Inject
@Named("myConcreteThing")
private Something _something;
これは、@EnableAutoConfiguration
および@ComponentScan
によって正しく取得されます。
同じ問題があり、次のようにApplicationクラスにコンポーネントスキャンパスを追加することで問題を解決できました。
@ComponentScan(basePackages= {"xx.xx"})