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

时间:2017-04-20 09:17:52

标签: java spring-mvc spring-boot spring-test

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

@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"));
}

}

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

5 个答案:

答案 0 :(得分:56)

所以这是解决方案:

documentation on detecting test configuration说:

  

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

因此,@SpringBootApplication类在包层次结构中应该高于测试类,例如,如果测试类在包com.zerosolutions.controller中,则@SpringBootApplication类应该在高于{{的包中1}}包即com.zerosolutions.controllercom.zerosolutions

<强>问题

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

  

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

<强>解决方案

如果您正在运行集成测试,则可以明确提及此类com.zerosolutions.general

@SpringBootApplication

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

<强>问题

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

  

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

并且MasterController没有像@WebMvtTest这样的classes属性来明确提及@SpringBootTest类。 所以有两种解决方案。

<强>解决方案

首先:将您的应用类移至高于测试类的包,即@SpringBootApplicationcom.zerosolutions包。

第二次:明确提及您的com课程,如下所示

@SpringBootApplication

希望清除Spring Test Configuration的混乱。谢谢

答案 1 :(得分:13)

如果您的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启动时 一般规则是测试类包装名称需要从即将被测试的JAVA类包装的名称开始

答案 2 :(得分:1)

检查src / test / java是否具有与主类软件包相同的软件包名称。 src / test / java / com / example / abc与src / test / java / com / example / abc

答案 3 :(得分:0)

我遇到了同样的错误,发现当我生成项目时,我的pom.xml显示我的groupId为com.example而不是我的实际域名:
<groupId>com.example</groupId>
我更正了pom.xml:
<groupId>com.mydomain</groupId>
接下来,我改变了文件结构:
src/test/java/com/examplesrc/test/java/com/mydomain
最后,我必须在我的内部更新包装声明 SampleProjectApplicationTest.java
文件以匹配正确的文件结构。一旦完成,测试工作正常。

我不确定我是如何得到com.example的,其中我的项目的其余部分是正确的,但在我的情况下修复就这么简单。

希望这有助于某人。

答案 4 :(得分:0)

只需将 Test 包名称替换为主应用程序类包名称即可。

示例:- React.useEffect() 这是我的主要应用程序包名称,因此,我将在我的测试包中放置相同的名称

这对我有用!