【发布时间】:2015-07-07 11:01:18
【问题描述】:
我正在尝试为 Spock 中的控制器编写测试。
@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)
}
}
Application 类只是 Spring Boot 最简单的配置(启用自动扫描)。它提供了一个带 PasswordEncryptor。我想用提供模拟的 bean 替换 Application 中的这个 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
@Qualifier 注释似乎根本不起作用。我能做什么?
编辑
问题不在于CreateUserControllerTest,而在于CreateUserController。
public class CreateUserController {
@Autowired
private PasswordEncryptor encryptor;
}
没有@Qualifier注解,所以Spring不知道应该注入哪个bean。不幸的是,我不知道如何让 Spring 用本地配置替换 Application 中的 PasswordEncryptor bean。
【问题讨论】:
-
我强烈建议改用构造函数注入。这使您可以轻松控制注入到被测类中的内容。
标签: java spring testing spring-boot spock