[Java] [Spring] Spring Boot Mystérieux hamarinet d'injection de dépendances

C'est peut-être une évidence pour ceux qui le savent, mais je vais le montrer ici parce que c'était une grande douleur.

environnement

supposition

Il y avait de telles interfaces de référentiel.

Pour les tests unitaires, j'ai créé une classe Configuration qui renvoie une maquette de chaque référentiel.

MyConfig.java


@Configuration
public class MyConfig {
    @Bean 
    public MenuRepository menuRepository() {
        return Mockito.mock(MenuRepository.class);
    }

    @Bean 
    public CategoryRepository categoryRepository() {
        return Mockito.mock(CategoryRepository.class);
    }

    @Bean 
    public UserRepository userRepository() {
        return Mockito.mock(UserRepository.class);
    }
}

Le test de la destination d'injection est comme ceci.

MyTest.java


//Abréviation
public class MyTest {
    @Autowired
    private MenuRepository menuRepository;

    @Autowired
    private CategoryRepository categoryRepository;

    @Autowired
    private UserRepository userRepository;
}

Mouvement mystérieux

La méthode @Bean categoryRepository est appelée, mais aucune autre méthode @Bean n'est appelée.

En conséquence, seul le référentiel de catégories est simulé à la destination de l'injection. .. ..

En regardant le contenu du conteneur, il n'y a que deux CategoryRepository (mock et original), et un seul autre.

Solution

En modifiant le nom de la méthode, toutes les méthodes @Bean sont désormais appelées en toute sécurité.

MyConfig.java


@Configuration
public class MyConfig {
    @Bean 
    @Primary
    public MenuRepository menuRepositoryBean() {
        return Mockito.mock(MenuRepository.class);
    }

    @Bean 
    @Primary
    public CategoryRepository categoryRepositoryBean() {
        return Mockito.mock(CategoryRepository.class);
    }

    @Bean 
    @Primary
    public UserRepository userRepositoryBean() {
        return Mockito.mock(UserRepository.class);
    }
}

De plus, j'ai eu une erreur disant que le type est activé, alors j'ai ajouté @ Primary.

Pourquoi cela arrive-t-il ...? ??

Recommended Posts

[Java] [Spring] Spring Boot Mystérieux hamarinet d'injection de dépendances
Injection de dépendances Spring à l'aide de Java, Kotlin
[Java] Thymeleaf Basic (Spring Boot)
Application Java CICS-Run - (4) Application Spring Boot
[Java] [Spring] Spring Boot 1.4-> 1.2 Note de rétrogradation
Elastic Beanstalk (Java) + Spring Boot + https
[Java] Intégration LINE avec Spring Boot
Spring Java
Créer un projet Java Spring Boot avec IntelliJ
Construction de l'environnement de développement Java Spring Boot + Docker
Injection de ressort divers
Défi Spring Boot
Conseils Java - Créez un projet Spring Boot avec Gradle
[Java] Hello World avec Java 14 x Spring Boot 2.3 x JUnit 5 ~
Forme de botte de printemps
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Spring Boot Rappelez-vous
gae + botte à ressort
Procédure de construction de LINE Bot x Java (Spring Boot)
[Java] Spring DI ③
[Java] [Spring Boot] Spécifier le profil d'exécution --Spring Boot à partir de NetBeans
[Java] Comment omettre l'injection de constructeur de ressort avec Lombok
Essayez la loi de l'inversion des dépendances avec plusieurs projets Spring Boot
Fiche d'apprentissage SPRING BOOT 01
Botte de printemps + Heroku Postgres
Rédaction de mémo de démarrage de printemps (1)
Première botte à ressort (DI)
Fiche d'apprentissage SPRING BOOT 02
Aide-mémoire Spring Boot2
Gestion des exceptions Spring Boot
Mappage du servlet Spring Boot
Environnement de développement-développement Spring Boot-
Procédure d'apprentissage Spring Boot
Apprentissage de Spring Boot [Début]
Rédaction de mémos de démarrage de printemps (2)
Résumé du document Spring Boot 2.2
[Spring Boot] DataSourceProperties $ DataSourceBeanCreationException
Disponibilité de l'application Spring Boot 2.3
Tutoriels Spring Boot Sujets
Dagger2 - Injection de dépendance Android
Injection d'expression de table Java
Télécharger avec Spring Boot
Changez la cible d'injection pour chaque environnement avec Spring Boot 2
Gérez l'API de date et d'heure Java 8 avec Thymeleaf avec Spring Boot
[Java] Déployer l'application Spring Boot sur Azure App Service
Comment appeler et utiliser l'API en Java (Spring Boot)
Présentation de Spring Boot2, un framework Java pour le développement Web (pour les débutants)
Développement piloté par domaine avec Java et Spring Boot-Layer et division de modules
[Java] Exemple de projet de développement d'applications Web avec Spring Boot