无法在Spring Boot Test 1.4中找到SpringBootConfiguration

6
我无法在Spring Boot 1.4中运行简单测试。我按照官方网站上的教程testing-the-spring-mvc-slice操作,但未能使其正常工作。
每次都会出现以下错误:
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test

有任何想法、提示吗?

提前感谢。

编辑:

这是控制器。

@Controller
public class UserManagementController {

@GetMapping(value = "/gs/users/getUsers")
    public @ResponseBody String getAllUsers() {
        return "test";
    }
}

这是一个测试

@RunWith(SpringRunner.class)
@WebMvcTest(UserManagementController.class)
public class UserManagementControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void showUserView() throws Exception {
        this.mvc.perform(get("/gs/users/getUsers"))
            .andExpect(status().isOk())
            .andDo(print());
    }
}

从我的角度看,这篇文章和该网站上的帖子完全相同。
@WebMvcTest将会:
- 自动配置Spring MVC、Jackson、Gson、消息转换器等。 - 加载相关组件(@Controller、@RestController、@JsonComponent等)。 - 配置MockMVC。
那我为什么需要配置一个“超级”类呢?

就像提示所说的那样,请使用其他的注释之一。 - Jaiwo99
是的,没错。但在官方文档中,他们说你可以使用那个,就足够了。 - Manu Zi
如果您提供已测试的类和测试本身,那么它会更清晰。 - Sergii Getman
@ManuZi,我更新了我的答案,对我有效,希望能帮到你。 - Sergii Getman
1个回答

11
搜索算法从包含测试的包开始向上运作,直到找到一个使用了 @SpringBootApplication 或 @SpringBootConfiguration 注解的类为止。只要你合理地结构化代码,通常可以找到主配置。因此,你已经用 @*Test 注释了你的测试。它运行并在子类中检查配置,但没有找到任何内容,于是抛出了异常。你必须在测试类的包或子包中拥有一个配置文件,或者直接将配置类传递给 @ContextConfiguration 或 @SpringBootTest,或者拥有一个被 @SpringBootApplication 注解的类。根据 @SpringBootApplication,在你提到的那个文章中,我已经按照你提到的方式使用了 @WebMvcTest 来测试控制器:如果应用程序有一个被注解为 @SpringBootApplication 的类,则测试可以正常工作;否则,会失败并抛出你提到的异常。这篇文章中也有一句话提到了这一点:“在这个例子中,我们省略了类,这意味着测试将首先尝试从任何内部类中加载 @Configuration,如果失败了,则会搜索主要的 @SpringBootApplication 类。”
Github关于相同观点的讨论Spring Boot文档

我有同样的问题。我想避免指向我的主要生产配置,因为它会加载所有数据库内容,简单的测试需要太长时间。我认为@WebMvcTest会加载轻量级配置(没有数据库,最小化网络),所以我将模拟服务层并快速测试控制器逻辑。但是看起来要测试控制器,我必须始终测试整个堆栈,创建数据库对象等。 - tequilacat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接