首页 > 解决方案 > WebMvcTest 太贪心了

问题描述

我想WebMvcTest在我的 Spring Boot 应用程序中为单个控制器编写一个测试。除其他外,我的应用程序中有一些自定义Converters。尽管我想测试的这个特定控制器不需要它们,但 Spring 无论如何都会尝试创建它们。

WebMvcTest现在的问题是:那些自定义转换器需要我的应用程序中没有被测试片初始化的更多bean 。并且不想模拟与特定测试完全无关的数十个 bean。除了在 中手动指定它们之外,从特定测试excludeFilters中排除某些 Web 组件的最佳实践是什么?WebMvcTest

标签: springspring-bootspring-testspring-test-mvc

解决方案


您可以使用自定义排除过滤器以避免将转换器加载到应用程序上下文中:

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = YourController.class, excludeFilters = @ComponentScan.Filter(type = CUSTOM, classes = NoConvertersFilter.class))
public class YourControllerTest {
...
}

class NoConvertersFilter extends TypeExcludeFilter {

    private static final String CONVERTER_INTERFACE_NAME = Converter.class.getName();

    @Override
    public boolean match(@NonNull final MetadataReader metadataReader, @NonNull final MetadataReaderFactory metadataReaderFactory) throws IOException {

        return Arrays.asList(metadataReader.getClassMetadata().getInterfaceNames()).contains(CONVERTER_INTERFACE_NAME);
    }
}

使用这种方法,您只需将 excludeFilter 添加到您不想加载转换器的那些控制器中。如果添加了新转换器,请不要担心:只要它实现了转换器接口,它就会被自动排除。


推荐阅读