如果我有如下所示的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应用程序感觉更像是一种解决方法。
答案 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());
}
}