我正在测试下面给出的控制器
@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配置。请指出正确的方向,这里发生了什么。以及如何解决这个问题。感谢
答案 0 :(得分:56)
所以这是解决方案:
documentation on detecting test configuration说:
搜索算法从包含测试的包开始工作,直到找到@SpringBootApplication或@SpringBootConfiguration注释类。只要您以合理的方式构建代码,通常就可以找到主要配置。
因此,@SpringBootApplication
类在包层次结构中应该高于测试类,例如,如果测试类在包com.zerosolutions.controller
中,则@SpringBootApplication
类应该在高于{{的包中1}}包即com.zerosolutions.controller
或com.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
类。
所以有两种解决方案。
<强>解决方案强>
首先:将您的应用类移至高于测试类的包,即@SpringBootApplication
或com.zerosolutions
包。
第二次:明确提及您的com
课程,如下所示
@SpringBootApplication
希望清除Spring Test Configuration的混乱。谢谢
答案 1 :(得分:13)
如果您的Application.java类(在src / main / java中)位于
下 com.A.B
您的测试类ApplicationTest.java(在src / test / java中)需要在
下 com.A.B
或com.A.B.C
或com.A.B.C.D
如果测试类位于以下包
下,则会出现此错误 com.A
或com.A.C
或com.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/example
至src/test/java/com/mydomain
最后,我必须在我的内部更新包装声明
SampleProjectApplicationTest.java
文件以匹配正确的文件结构。一旦完成,测试工作正常。
我不确定我是如何得到com.example的,其中我的项目的其余部分是正确的,但在我的情况下修复就这么简单。
希望这有助于某人。
答案 4 :(得分:0)
只需将 Test 包名称替换为主应用程序类包名称即可。
示例:- React.useEffect()
这是我的主要应用程序包名称,因此,我将在我的测试包中放置相同的名称
这对我有用!