我正在测试下面给出的控制器
@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 许可协议
所以这是解决方案:
有关检测测试配置的文档 说:
所以
@SpringBootApplication
类在包层次结构中应该比测试类更高,例如,如果测试类在包中com.zerosolutions.controller
那么@SpringBootApplication
应该在包中 - 更高的类比com.zerosolutions.controller
包即com.zerosolutions
或com
。问题
但是如果
@SpringBootApplication
类与测试类处于同一级别,它将无法找到它,即com.zerosolutions.general
。在这种情况下,您将收到以下错误:解决方案
如果您正在运行集成测试,则可以像这样明确提及
@SpringBootApplication
类但是如果你想对控制器进行单元测试,你不需要启动整个 Spring 上下文。您可以将
@SpringBootTest
替换为@WebMvcTest(MasterController.class)
。这将只实例化 web 层MasterController
而不是整个 Spring 上下文。问题
但问题是您将再次遇到我们之前遇到的错误:
And
@WebMvtTest
does not have aclasses
attribute like@SpringBootTest
to explicitly mention the@SpringBootApplication
class.因此,有两种解决方案。解决方案
第一:将您的应用程序类移动到高于测试类的包,即
com.zerosolutions
或com
包。第二:明确提及您的
@SpringBootApplication
类,如下所示希望能消除 Spring 测试配置的困惑。谢谢