为什么spring@qualifier不能与spock和spring boot一起工作

kpbpu008  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(373)

我在试着给斯波克的控制器写一个测试。

@ContextConfiguration(loader = SpringApplicationContextLoader.class,
    classes = [Application.class, CreateUserControllerTest.class])
@WebAppConfiguration
@Configuration
class CreateUserControllerTest extends Specification {

    @Autowired
    @Qualifier("ble")
    PasswordEncryptor passwordEncryptor

    @Autowired
    UserRepository userRepository

    @Autowired
    WebApplicationContext context

    @Autowired
    CreateUserController testedInstance

    def "Injection works"() {
        expect:
        testedInstance instanceof CreateUserController
        userRepository != null
    }

    @Bean
    public UserRepository userRepository() {
        return Mock(UserRepository.class)
    }

    @Bean(name = "ble")
    PasswordEncryptor passwordEncryptor() {
        return Mock(PasswordEncryptor)
    }

}

应用程序类只是spring引导最简单的配置(启用自动扫描),它提供了一个带密码加密程序的。我想用提供模拟的bean替换应用程序中的这个bean。
但不幸的是,spring抛出了一个nouniquebeandefinitionexception:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.jasypt.util.password.PasswordEncryptor] is defined: expected single matching bean but found 2: provide,ble
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 54 more

@限定符注解似乎根本不起作用。我能做什么?
编辑
问题不在 CreateUserControllerTest 但是在 CreateUserController .

public class CreateUserController {
    @Autowired
    private PasswordEncryptor encryptor;
}

根本没有 @Qualifier 注解,所以spring不知道应该注入哪个bean。不幸的是,我不知道如何使Spring来代替 PasswordEncryptor 通过本地配置从应用程序中删除bean。

zbdgwd5y

zbdgwd5y1#

@Qualifier 是连接bean的一个特定示例,如果您有同一接口的多个实现。
但仍然需要为spring上下文中的每个bean提供一个“唯一”的名称。
所以您正在尝试注册两个名为' passwordEncryptor '. 一个在测试中,另一个似乎在实际代码中 Application.class '.
如果你想模仿“passwordencryptor”,可以使用 @Mock 或者 @Spy . (或者)如果要避免错误,请更改方法的名称以避免示例名称冲突。

@Mock
private PasswordEncryptor passwordEncryptor;

or

@Spy
private PasswordEncryptor passwordEncryptor;

编辑
该错误的另一种可能性是在您定义的代码中的某个地方 @Autowired 为' passwordEncryptor “没有 @Qualifier 标签,
但是
你有两个 @Bean(name="...") passwordEncryptor 定义了,所以spring上下文在选择哪个字段“自动关联”时很混乱。

相关问题