错误:为弹簧控制器执行@WebMvcTest时找不到@SpringBootConfiguration

2022-08-31 19:42:13

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

@Controller
public class MasterController {

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

我正在按照这个春季文档来测试我的控制器。现在,我想通过实例化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"));
}

}

当我运行此测试时,我收到错误。但是我很困惑为什么当我们不希望它实例化它而只想使用Web层时,它要求Spring配置。请指出这里正在发生的事情的正确方向。以及如何解决这个问题。谢谢Unable to find @SpringBootConfiguration,...etc


答案 1

所以这是解决方案:

有关检测测试配置的文档说:

搜索算法从包含测试的包开始工作,直到找到@SpringBootApplication或@SpringBootConfiguration带注释的类。只要您以合理的方式构建了代码,通常就可以找到您的主要配置。

因此,类在包层次结构中应该高于测试类,例如,如果测试类在包中,则类应该在高于包的包中,即或。@SpringBootApplicationcom.zerosolutions.controller@SpringBootApplicationcom.zerosolutions.controllercom.zerosolutionscom

问题

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

java.lang.IllegalStateException:找不到@SpringBootConfiguration,你需要在测试中使用@ContextConfiguration或@SpringBootTest(classes=...)

溶液

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

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

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

问题

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

java.lang.IllegalStateException:找不到@SpringBootConfiguration,你需要在测试中使用@ContextConfiguration或@SpringBootTest(classes=...)

并且没有像显式提及类这样的属性。因此,有两种解决方案。@WebMvtTestclasses@SpringBootTest@SpringBootApplication

溶液

首先:将应用程序类移动到高于测试类(即包)的包中。com.zerosolutionscom

第二:明确提及您的类,如下所示@SpringBootApplication

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

希望能清除弹簧测试配置的混乱。谢谢


答案 2

如果您的 Application.java类(在 src/main/java 中)位于

com.A.B

您的测试类 ApplicationTest.java(在 src/test/java 中)需要位于

com.A.B或或com.A.B.Ccom.A.B.C.D

如果测试类位于以下包下,您将收到此错误

com.A或或com.A.Ccom.A.D

在Spring Boot中,一般规则是测试类包名称需要以要测试的JAVA类包的包名称开头


推荐