【问题标题】:Unsatisfied dependency when running a Junit Test in Spring app在 Spring 应用程序中运行 Junit 测试时不满足的依赖关系
【发布时间】:2019-11-23 11:57:13
【问题描述】:

我在一个maven项目中有这个配置类:

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 项目中有这个服务类:

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 类,它应该可以工作。
  • 什么是SmsConfig@Configuration?如果是这样,这不是初始化服务的方式,你要在配置中声明一个@Bean
  • '@Bean' 不适用于 Type
  • @IndraneelBende,请转换为回答

标签: java spring spring-mvc junit integration-testing


【解决方案1】:

我认为您混淆了 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);
}

【讨论】:

    【解决方案2】:

    您的上下文配置中缺少AltiriaSMSRestServiceImpl 类。在你的上下文配置中指定AltiriaSMSRestServiceImpl 类,它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 2021-04-15
      • 2017-12-18
      • 2017-06-09
      • 1970-01-01
      • 2018-06-15
      • 2021-05-24
      • 2020-04-29
      • 1970-01-01
      相关资源
      最近更新 更多