2016-08-14 5 views
6

Имейте очень легкий проект Spring Boot 1.4, созданный с start.spring.io.Spring Boot 1.4 - TestRestTemplate Недостаточное исключение зависимостей

Пытается провести тест интеграции для @RestController с использованием @RequestBody с использованием TestRestTemplate, но успеха нет из-за исключения при запуске.

Единственный класс конфигурации:

@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.b[email protected]5444f1c3] to prepare test instance [[email protected]] 

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 в путь к классам, как он рекомендовал.

Что я пропустил?

+0

Просто нашел '@ AutoConfigureTestDatabase' аннотацию следует использовать в связке с' @ SpringBootTest' вместо '@ DataJpaTest' в случае как это – WildDev

ответ

5

Вы указываете @DataJpaTest, который сообщает Spring, чтобы исключить любую проводку веб-контекста для тестов. Как таковой не создается TestRestTemplate. Читать этот блог для более подробной информации вокруг тестирования ломтиков приложения: https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4#testing-application-slices

0

У меня была аналогичная проблема, работает главный класс в Eclipse, используя Serenity BDD тесты с пружинного ботинке. Он начинает сбой после того, как я добавил тестовую зависимость spring-boot-test-autoconfigure. Это происходит потому, что Eclipse помещает все в один загрузчик классов. Чтобы исправить эту ошибку, я создал один класс конфигурации, переопределяющий поведение по умолчанию весенней загрузки . Этот код был основан в одной пружинного классе (объем не является общедоступным) 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; 
    } 
} 
Смежные вопросы