运行 在 Spring 应用程序中进行 Junit 测试时不满足依赖关系
Unsatisfied dependency when running a Junit Test in Spring app
我在一个maven项目中有这样的配置class:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import lombok.Data;
@Data
@Configuration
public class SmsConfig {
@Value("${sms.domainId}")
private String domainId;
@Value("${sms.gateway.url}")
private String gatewayUrl;
@Value("${sms.cmd}")
private String cmd;
@Value("${sms.login}")
private String login;
@Value("${sms.passwd}")
private String passwd;
}
我在 Spring 项目中有此服务 class:
Service("smsService")
public class AltiriaSMSRestServiceImpl implements SmsService {
private final SmsConfig smsConfig;
public AltiriaSMSRestServiceImpl(SmsConfig smsConfig) {
this.smsConfig = smsConfig;
}
@Override
public boolean sendSMS(String msg, String to) throws Exception {
...
}
...
}
和这个测试:
@ContextConfiguration(classes = { SmsConfig.class })
@RunWith(SpringJUnit4ClassRunner.class)
public class AltiriaSMSRestServiceImplTest {
@Autowired
@Qualifier("smsService")
private AltiriaSMSRestServiceImpl smsService;
@Test
public void testSendSMS() throws Exception {
smsService.sendSMS("this is a test", "+34776498");
}
}
但是当我 运行 测试时我有这个错误:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.bonanza.service.AltiriaSMSRestServiceImplTest': Unsatisfied dependency expressed through field 'smsService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.bonanza.service.AltiriaSMSRestServiceImpl' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value="smsService")}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:116)
您的上下文配置中缺少 AltiriaSMSRestServiceImpl
class。在你的上下文配置中指定 AltiriaSMSRestServiceImpl
class,它应该可以工作。
我认为您混淆了 Spring 配置和配置属性。
@Service("smsService")
public class AltiriaSMSRestServiceImpl implements SmsService {
private final SmsConfigData smsConfig;
public AltiriaSMSRestServiceImpl(SmsConfigData smsConfig) {
this.smsConfig = smsConfig;
}
...
}
// the configuration data, mapped to the application.properties/yml file
@ConfigurationProperties(prefix="sms")
@Data
public class SmsConfigData {
@Value("${domainId}")
private String domainId;
...
}
// this is a spring configuration class, ie the definition of spring beans
// I don't think you even need this, since the
// SmsConfigData gets constructor-injected automatically
// this is the class that gets included in the test config class list
@Configuration
public class SmsServiceConfiguration {
@Bean
SmsService smsService(SmsConfigData config) {
return new AltiriaSMSRestServiceImpl(config);
}
我在一个maven项目中有这样的配置class:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import lombok.Data;
@Data
@Configuration
public class SmsConfig {
@Value("${sms.domainId}")
private String domainId;
@Value("${sms.gateway.url}")
private String gatewayUrl;
@Value("${sms.cmd}")
private String cmd;
@Value("${sms.login}")
private String login;
@Value("${sms.passwd}")
private String passwd;
}
我在 Spring 项目中有此服务 class:
Service("smsService")
public class AltiriaSMSRestServiceImpl implements SmsService {
private final SmsConfig smsConfig;
public AltiriaSMSRestServiceImpl(SmsConfig smsConfig) {
this.smsConfig = smsConfig;
}
@Override
public boolean sendSMS(String msg, String to) throws Exception {
...
}
...
}
和这个测试:
@ContextConfiguration(classes = { SmsConfig.class })
@RunWith(SpringJUnit4ClassRunner.class)
public class AltiriaSMSRestServiceImplTest {
@Autowired
@Qualifier("smsService")
private AltiriaSMSRestServiceImpl smsService;
@Test
public void testSendSMS() throws Exception {
smsService.sendSMS("this is a test", "+34776498");
}
}
但是当我 运行 测试时我有这个错误:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.bonanza.service.AltiriaSMSRestServiceImplTest': Unsatisfied dependency expressed through field 'smsService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.bonanza.service.AltiriaSMSRestServiceImpl' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value="smsService")}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:116)
您的上下文配置中缺少 AltiriaSMSRestServiceImpl
class。在你的上下文配置中指定 AltiriaSMSRestServiceImpl
class,它应该可以工作。
我认为您混淆了 Spring 配置和配置属性。
@Service("smsService")
public class AltiriaSMSRestServiceImpl implements SmsService {
private final SmsConfigData smsConfig;
public AltiriaSMSRestServiceImpl(SmsConfigData smsConfig) {
this.smsConfig = smsConfig;
}
...
}
// the configuration data, mapped to the application.properties/yml file
@ConfigurationProperties(prefix="sms")
@Data
public class SmsConfigData {
@Value("${domainId}")
private String domainId;
...
}
// this is a spring configuration class, ie the definition of spring beans
// I don't think you even need this, since the
// SmsConfigData gets constructor-injected automatically
// this is the class that gets included in the test config class list
@Configuration
public class SmsServiceConfiguration {
@Bean
SmsService smsService(SmsConfigData config) {
return new AltiriaSMSRestServiceImpl(config);
}