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

新手上路,请多包涵

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

@Controller
public class MasterController {

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

我正在按照 这个 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"));
}

}

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

原文由 Meena Chaudhary 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 566
2 个回答

所以这是解决方案:

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

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

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

问题

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

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

解决方案

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

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

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

问题

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

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

And @WebMvtTest does not have a classes attribute like @SpringBootTest to explicitly mention the @SpringBootApplication class.因此,有两种解决方案。

解决方案

第一:将您的应用程序类移动到高于测试类的包,即 com.zerosolutionscom 包。

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

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

希望能消除 Spring 测试配置的困惑。谢谢

原文由 Meena Chaudhary 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

com.A.B

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

com.A.Bcom.A.B.Ccom.A.B.C.D

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

com.Acom.A.Ccom.A.D

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

原文由 Tadele Ayelegn 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题