编程语言
首页 > 编程语言> > java – 错误:在为Spring Controller执行@WebMvcTest时无法找到@SpringBootConfiguration

java – 错误:在为Spring Controller执行@WebMvcTest时无法找到@SpringBootConfiguration

作者:互联网

我正在测试下面给出的控制器

@Controller
public class MasterController {

@GetMapping("/")
public String goLoginPage(){
    return "index";
}
}

我正在关注this Spring文档来测试我的控制器.
现在,我想通过实例化Web层而不是文档中给出的整个Spring上下文来测试我的控制器.下面是我的相同代码.

@RunWith(SpringRunner.class)
@WebMvcTest
public class MasterControllerTestWithWebLayer {

@Autowired
MockMvc mockMvc;

@Autowired
MasterController masterController;


@Before
public void setUp() throws Exception {
}

@After
public void tearDown() throws Exception {
}

@Test
public void testLoginHome() throws Exception{
    mockMvc.perform(get("/"))
    .andExpect(status().isOk())
    .andExpect(view().name("index"));
}

}

当我运行此测试时,我得到错误无法找到@SpringBootConfiguration,…等.但我很困惑为什么当我们不希望它实例化它但只想使用Web层时它要求Spring配置.请指出正确的方向,这里发生了什么.以及如何解决这个问题.谢谢

解决方法:

所以这是解决方案:

documentation on detecting test configuration说:

The search algorithm works up from the package that contains the test until it finds a @SpringBootApplication or @SpringBootConfiguration annotated class. As long as you’ve structure your code in a sensible way your main configuration is usually found.

所以@SpringBootApplication类在包层次结构中应该比测试类更高,例如,如果测试类在com.zerosolutions.controller包中,那么@SpringBootApplication类应该在比com.zerosolutions.controller包更高的包中,即com.zerosolutions或者COM.

问题

但是如果@SpringBootApplication类与测试类处于同一级别,它将无法找到它,即com.zerosolutions.general.在这种情况下,您将收到以下错误:

java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=…) with your test

如果您正在运行集成测试,则可以像这样明确提及@SpringBootApplication类

@RunWith(SpringRunner.class)
@SpringBootTest(classes={SpringBootApp.class})

但是如果你想对控制器进行单元测试,则不需要启动整个Spring上下文.您可以使用@WebMvcTest(MasterController.class)替换@SpringBootTest.这将仅使用MasterController实例化Web层,而不是整个Spring上下文.

问题

但问题是你将再次遇到我们之前遇到的错误:

java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=…) with your test

并且@WebMvtTest没有类似@SpringBootTest的类属性来明确提及@SpringBootApplication类.
所以有两个解决方案.

第一步:将应用程序类移动到高于测试类的包,即com.zerosolutions或com包.

第二:明确地提到你的@SpringBootApplication类,如下所示

@RunWith(SpringRunner.class)
@WebMvcTest(MasterController.class)
@ContextConfiguration(classes={SpringBootApp.class})

希望能够清除Spring Test Configuration的混乱.谢谢

标签:java,spring-boot,spring-mvc,spring-test
来源: https://codeday.me/bug/20191004/1853548.html