在我的 Spring Boot 2.7 应用程序中,我使用 ViewControllerRegistry 注册了一个简单的 ViewController,因此起始页没有专用的控制器:
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("home");
}
在我的测试类中,我尝试过滤掉一些扩展 CrudRepository 的 Spring data JPA 存储库接口:
@WebMvcTest(
excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,
classes = CrudRepository.class)})
class HomeControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testHomePage() throws Exception {
mockMvc.perform(get("/"))
.andExpect(status().isOk());
}
}
我无法启动
@WebMvcTest
所需的上下文,因为我在其他测试中使用这些 JPA 存储库接口并且它们被选取。
它们目前看起来都是这样的:
public interface EntityNameRepository extends CrudRepository<EntityName, Long>
ApplicationContext 无法加载,测试因此失败。
我可以使用
@MockBean
添加存储库并忽略它们,从而使测试通过,但我希望在运行此测试时根本不将它们加载到 ApplicationContext 中。
这就是我尝试使用排除过滤器实现的目标。但无论我是否添加确切的存储库名称或任何存储库名称,仍然会选择加载。
当我运行 WebMvc 测试时,我可以选择哪些选项来忽略存储库以及未来的类?我认为这应该可以使用排除过滤器来实现,但似乎我错过了一些东西。
我已经四处搜索并查看了文档,但似乎如何正确设置排除过滤器的详细信息让我无法理解。欢迎大家在这里指点。
在找到一些对选项的正确描述(Baeldung)后,我偶然发现了一个解决方案,并选择了正则表达式,因为所有源文件的名称中都有“存储库”:
@WebMvcTest(excludeFilters = {@ComponentScan.Filter(
type = FilterType.REGEX,
pattern = ".*[Repository]")}
)