我想爲Spock中的控制器編寫一個測試。爲什麼Spring @Qualifier不能與Spock和Spring Boot配合使用
@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)
}
}
應用類只是春天啓動簡單的配置(使自動掃描)。它提供了一個與PasswordEncryptor。我想用Application提供一個模擬來替換這個bean。
但不幸的是春天拋出一個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。
我強烈建議使用構造函數注入。這使您可以輕鬆控制注入到受測試的類中的內容。 – chrylis