我在试着给斯波克的控制器写一个测试。
@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。
1条答案
按热度按时间zbdgwd5y1#
@Qualifier
是连接bean的一个特定示例,如果您有同一接口的多个实现。但仍然需要为spring上下文中的每个bean提供一个“唯一”的名称。
所以您正在尝试注册两个名为'
passwordEncryptor
'. 一个在测试中,另一个似乎在实际代码中Application.class
'.如果你想模仿“passwordencryptor”,可以使用
@Mock
或者@Spy
. (或者)如果要避免错误,请更改方法的名称以避免示例名称冲突。编辑
该错误的另一种可能性是在您定义的代码中的某个地方
@Autowired
为'passwordEncryptor
“没有@Qualifier
标签,但是
你有两个
@Bean(name="...") passwordEncryptor
定义了,所以spring上下文在选择哪个字段“自动关联”时很混乱。