J'écris un composant avec Spring Boot et Spring Boot JPA. J'ai une configuration comme celle-ci:
L'interface:
public interface Something {
// method definitions
}
La mise en oeuvre:
@Component
public class SomethingImpl implements Something {
// implementation
}
Maintenant, j'ai un test JUnit qui fonctionne avec SpringJUnit4ClassRunner
et je veux tester ma SomethingImpl
avec ceci.
Quand je fais
@Autowired
private Something _something;
ça marche, mais
@Autowired
private SomethingImpl _something;
provoque l'échec du test lors du lancement d'une NoSuchBeanDefinitionException
avec le message 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)}
Mais dans le cas de test, je veux explicitement injecter ma SomethingImpl
car c'est la classe que je veux tester. Comment y parvenir?
Si vous voulez un bean spécial, vous devez utiliser l'annotation @Qualifier
:
@Autowired
@Qualifier("SomethingImpl")
private Something _something;
J'ai pensé que vous pouvez faire la même chose avec un DI de style javax.inject
:
@Named("myConcreteThing")
public class SomethingImpl implements Something { ... }
Où vous voulez l'injecter:
@Inject
@Named("myConcreteThing")
private Something _something;
Ceci est correctement pris en charge par @EnableAutoConfiguration
et @ComponentScan
.
Je pense que vous devez ajouter @Service dans la mise en œuvre de la classe .. comme
@Service public class SomethingImpl implements Something { // implementation }