如何在测试中自动连接ErrorAttributes?

时间:2015-02-23 10:05:58

标签: spring spring-boot integration-testing spring-test

这可能是非常基本的,但我是Spring Boot的新手(以及Spring的许多方面),而the documentation并没有直接回答这个问题。

设置

使用最新的Spring Boot(1.2.1),我有一些集成测试,其中Spring被加载并且依赖性很好地自动装配(设置它很简单)。

测试的基类:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public abstract class IntegrationTest {

}

Application课程不仅仅包含SpringApplication.run()主要方法和这些注释:

@ComponentScan
@EnableAutoConfiguration
@EnableScheduling

示例测试:

public class UserServiceTest extends IntegrationTest {    
    @Autowired
    UserService userService;

    @Test
    public void testSomething() throws Exception {
        // Use UserService; make assertions
    }    
}

对于必要的依赖性,我只有spring-boot-starter-test

<!-- Typical Spring Boot test dependencies: Spring Test, JUnit, Hamcrest, Mockito -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

问题

我创建了一个自定义的ErrorController along these lines,我在其中定义了一个@Autowired ErrorAttributes字段。请参阅the CustomErrorController source code

在此之后,Spring集成测试停止了工作:

java.lang.IllegalStateException: Failed to load ApplicationContext
...
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
    No qualifying bean of type [org.springframework.boot.autoconfigure.web.ErrorAttributes] found for dependency: 
    expected at least 1 bean which qualifies as autowire candidate for this dependency. 
    Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

问题

什么是最简单的,最简洁的方法是在测试中注入ErrorAttributes bean?

我应该创建单独的Application用于测试,使用某种模拟的ErrorAttributes bean,还是可能有更简单的方法?我是否缺少与网络/控制器测试相关的帮助或依赖?

3 个答案:

答案 0 :(得分:6)

使用@WebIntegrationTest

为您的测试基类或单个测试用例类添加注释

这里提到:

http://docs.spring.io/spring-boot/docs/1.2.1.RELEASE/reference/htmlsingle/#boot-features-testing-spring-boot-applications

答案 1 :(得分:5)

您可以使用@WebAppConfiguration注释测试类,以指示Spring的测试框架创建Web应用程序上下文(足以自动装配ErrorAttributes),而无需实际启动嵌入式容器。

答案 2 :(得分:2)

以下代码正在为我提供带注释的Spring启动

@RunWith(SpringJUnit4ClassRunner.class)

@SpringApplicationConfiguration(classes =Application.class)

@WebIntegrationTest(randomPort=true)

@ContextConfiguration(classes = Application.class)


public class MyRepositoryIntegrationTests  {

    @Autowired
    private IMyRepository myRepository;



       @Test
       public void testSalutationMessage() {
          System.out.println("Inside testSalutationMessage()"+my.findAll());

          //assertEquals(message,message);
       }

}