如何从@WebMvcTest中排除@SpringBootApplication中有线的服务

时间:2018-10-07 05:56:44

标签: spring spring-boot

如果我有如下所示的spring boot类:

@SpringBootApplication
public class DemoApplication {

    @Autowired
    final FoService foService;

    public DemoApplication(FoService foService) {
        this.foService = foService;
    }

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

和以下测试:

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = FoController.class, secure = false)
public class FoControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void getFo() throws Exception {
        mockMvc.perform(get("/fo/"))

            .andExpect(status().isOk());

    }
}

由于无法找到FoService,因此测试失败。我可以添加:

@MockBean
private FoService foService;

进行测试。或在测试源代码树中添加新的spring boot应用程序,它不会连接服务,并且测试将开始工作。

我的问题是,是否还有另一种选择,也许使用excludeFilters属性?

实际上,我从主Spring Boot应用程序连接了多个服务,而我不想全部模拟它们。另外,创建一个测试spring boot应用程序感觉更像是一种解决方法。

2 个答案:

答案 0 :(得分:1)

容易,请勿在Main应用程序类中添加任何内容。任何Spring Boot测试或诸如WebMvcTest之类的Slice测试都将使用并尝试加载其中包含的任何Bean或元注释。例如。任何@Enable..

最好将bean移到Configuration类,并仅使用SpringBootApplication和main方法来保留Main应用程序。

答案 1 :(得分:0)

下面应该可以工作。如果您要加载颗粒控制器,则必须模拟所有依赖项。@AutoConfigureMockMvc应该适合您的情况。

@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
public class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void getFo() throws Exception {
        mockMvc.perform(get("/user"))

                .andExpect(status().isOk());

    }
}