我正在尝试使用Spring Boot编写集成测试,测试我的一个控制器中的事务逻辑。
测试应该做什么,如下:
现在我的问题是,当测试运行时,控制器被注入我的测试类,但其所有依赖项都是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?但直接
答案 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并像往常一样调用方法。