【问题标题】:Spring Boot 1.4 - TestRestTemplate Unsatisfied dependency exceptionSpring Boot 1.4 - TestRestTemplate Unsatisfied 依赖异常
【发布时间】:2016-12-21 02:51:42
【问题描述】:

有一个非常轻量级的 Spring Boot 1.4 项目,从 start.spring.io 生成。

尝试使用TestRestTemplate@RestController@RequestBody 运行集成测试,但由于启动异常而没有成功。

唯一的配置类:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

配置文件application.properties 几乎没有,除了security.ignored=/** 用于测试目的。

测试类:

@RunWith(SpringRunner.class)
@SpringBootTest
@DataJpaTest
public class MyControllerTest {

    private Logger log = Logger.getLogger(getClass());

    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    private TestEntityManager entityManager;

    @Before
    public void init() {

        log.info("Initializing...");
    }

    @Test
    public void addTest() throws Exception {

        log.info("MyController add test starting...");

        // restTemplate usage

        log.info("MyController add test passed");
    }
}

...但是在测试启动过程中出现以下异常:

ERROR 6504 --- [           main] o.s.test.context.TestContextManager      : Caught exception while allowing TestExecutionListener [org.springframework.boot.test.autoconfigure.AutoConfigureReportTestExecutionListener@5444f1c3] to prepare test instance [com.myproject.controllers.MyControllerTest@5d2bc446]

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.myproject.controllers.MyControllerTest': Unsatisfied dependency expressed through field 'restTemplate': No qualifying bean of type [org.springframework.boot.test.web.client.TestRestTemplate] found for dependency [org.springframework.boot.test.web.client.TestRestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.boot.test.web.client.TestRestTemplate] found for dependency [org.springframework.boot.test.web.client.TestRestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:569) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]

根据doc,不需要在任何地方配置TestRestTemplate。不过,我已按照建议将最新的 Apache Http Client 添加到类路径中。

我错过了什么?

【问题讨论】:

  • 刚刚发现@AutoConfigureTestDatabase注解应该和@SpringBootTest一起使用,而不是@DataJpaTest在这种情况下

标签: java spring exception spring-boot autowired


【解决方案1】:

您正在指定@DataJpaTest,它告诉 Spring 排除测试的 Web 上下文的任何连接。因此,没有创建 TestRestTemplate。阅读此博客以了解有关测试应用程序切片的更多详细信息:https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4#testing-application-slices

【讨论】:

    【解决方案2】:

    我在 Eclipse 上使用 Serenity BDD 测试和 spring-boot 运行主类时遇到了类似的问题。添加 spring-boot-test-autoconfigure 测试依赖项后,它开始失败。这是因为 Eclipse 将所有内容都放在了一个类加载器中。为了修复这个错误,我创建了一个配置类来覆盖 spring-boot 的默认行为。此代码基于一个 spring 类(范围不公开)SpringBootTestContextCustomizer.TestRestTemplateFactory

    @TestConfiguration
    public class TestConfig {
    
        // Overriding Default Spring Boot TestRestTemplate to allow 
        // execute the main method from Eclipse (mixed Classloader) 
        @Bean
        @Primary
        public TestRestTemplate testRestTemplate(ApplicationContext context, RestTemplateBuilder templateBuilder) {
            final AbstractConfigurableEmbeddedServletContainer container = context.getBean(AbstractConfigurableEmbeddedServletContainer.class);
            final boolean sslEnabled = container.getSsl() != null && container.getSsl().isEnabled();
            final TestRestTemplate template = new TestRestTemplate(templateBuilder.build(), null, null, sslEnabled? new HttpClientOption[]{}: new HttpClientOption[]{HttpClientOption.SSL});
            template.setUriTemplateHandler(new LocalHostUriTemplateHandler(context.getEnvironment(), sslEnabled ? "https" : "http"));
            return template;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 2018-09-29
      • 2016-12-21
      • 2018-06-10
      • 2020-09-10
      • 2018-10-03
      • 2019-02-26
      相关资源
      最近更新 更多