测试Spring Mvc控制器并注入静态类

时间:2017-02-20 12:47:47

标签: spring-mvc spring-boot junit

以下代码是为Mvc控制器编写JUnit测试的标准方法。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ApplicationTestCassandra.class)
@WebAppConfiguration
public class TestControllerTests {

    @Autowired
    private WebApplicationContext webApplicationContext;

    private MockMvc mockMvc;

    @Before
    public void setup() throws Exception {
        this.mockMvc = webAppContextSetup(webApplicationContext).build();
    }

    @Test
    public void testupTimeStart() throws Exception {
        this.mockMvc.perform(get("/uptime"))
                .andExpect(status().isOk());

    }
}

这很好用,但我想用一个特殊的类替换一个自动装配的类进行测试。 CassandraSimpleConnection类通过我的控制器中的@Autowired注入。 我尝试了几种方法,但没有运气。 由于Mvc 404错误,以下代码失败,因为我猜我的REST接口应用程序根本没有运行。

@RunWith(SpringJUnit4ClassRunner.class)
//ApplicationTestCassandra is SpringBoot application startpoint class with @SpringBootApplication annotation
//@ContextConfiguration(classes = ApplicationTestCassandra.class, loader = AnnotationConfigContextLoader.class)
@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class)//, classes = {ApplicationTestCassandra.class})
@WebAppConfiguration
public class TestControllerTests {

    @Service
    @EnableWebMvc
    @ComponentScan(basePackages={"blabla.functionalTests"})
    static class CassandraSimpleConnection {

        public Metadata testConnection(TestConfiguration configuration) {
            Metadata metadata = null;
            // return metadata;

            throw new RuntimeException("Could not connect to any server");
        }
    }

如果我使用

@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class,    classes = {ApplicationTestCassandra.class})

CassandraSimpleConnection不会替换为我的静态类。

有人可以帮我吗?关于注释的文档非常混乱。

1 个答案:

答案 0 :(得分:0)

阅读评论,这是解决方案:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { MyApplication.class })
public class MyTests {

        @MockBean
        private MyBeanClass myTestBean;

        @Before
        public void setup() {
             ...
             when(myTestBean.doSomething()).thenReturn(someResult);
        }

        @Test
        public void test() {
             // MyBeanClass bean is replaced with myTestBean in the ApplicationContext here
        }
}