Spring Boot集成测试注入控制器依赖性

时间:2017-01-20 17:39:06

标签: spring spring-mvc spring-boot spring-test spring-test-mvc

我正在尝试使用Spring Boot编写集成测试,测试我的一个控制器中的事务逻辑。

测试应该做什么,如下:

  1. 使用@Inject
  2. 注入我的一个控制器
  3. 使用Mock替换控制器依赖项中的电子邮件依赖项,以避免在集成测试期间实际发送电子邮件。
  4. 调用控制器的方法
  5. 断言当邮件发送模拟抛出异常时,被调用方法的事务会正确回滚。
  6. 现在我的问题是,当测试运行时,控制器被注入我的测试类,但其所有依赖项都是null。这是我的集成测试:

    @RunWith(SpringJUnit4ClassRunner.class)
    @IntegrationTest
    @SpringApplicationConfiguration(App.class)
    @WebIntegrationTest
    public MyIntegrationTest () {
    
        @Inject MyController controller;
    
        @Before
        public void before () {
           // replace one particular dependency of controller with a mock
        }
    
        @Test
        public void testFoo () { ... }
    }
    

    由于测试是一个集成测试,它启动了一个完整的Spring Web应用程序上下文,我期待我的控制器将所有的依赖项已经自动装配,但显然不是这种情况,而是所有依赖项都设置为null

    问题:我是否需要使用一些额外的注释,或者在我的@Before方法中设置一些内容?或者我是从一个完全错误的方面解决问题?

    更新:是否可以测试我的Spring MVC Layer,而无需通过HTTP进行测试,例如使用TestRestTemplate或MockMvc?但直接

1 个答案:

答案 0 :(得分:0)

使用TestRestTemplate进行测试,而不是注入控制器本身。控制器显然是一个spring bean,但如果你直接在测试类中注入它,它将无法初始化上下文。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = ExampleStart.class)
public class ExampleTest {
    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void exampleTest() {
        String body = this.restTemplate.getForObject("/", String.class);
        assertThat(body).isEqualTo("Hello World");
    }
}

ExampleStart.java - >春季靴子入门级

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class ExampleStart extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(ExampleStart.class);
    }

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

参考:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html

但是如果你想测试服务方法,可以使用@Autowired并像往常一样调用方法。