Spring MVC Controller测试,并模拟许多类 - java

我们的系统中有许多Controller,还有许多Spring Data存储库。

我想为通过我的MVC上下文运行的控制器编写测试。

但是,必须手动模拟系统中的每个服务和存储库似乎很麻烦,而且不合适,因此我可以测试控制器

例如

FooControllerTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextHierarchy(value = {
    @ContextConfiguration(classes = { MockServices.class }),
    @ContextConfiguration({ "classpath:/META-INF/spring/mvc-servlet-context.xml" }),
})
public class FooControllerTest {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mvc;

    @Autowired
    private FooRepository fooRepository;

    @Autowired
    private FooService fooService; 

    @Before
    public void setUp() throws Exception {
        mvc = webAppContextSetup(wac).build();
    }

    @Test
    public final void list() {
        when(fooRepository.findAll()).thenReturn(...);
        mvc.perform(get("/foo"))...
    }

    @Test
    public final void create() {
        Foo fixture = ...
        when(fooService.create(fixture)).thenReturn(...);
        mvc.perform(post("/foo"))...
    }

}

MockServices.java

@Configuration
public class MockServices {

    @Bean
    public FooRespository fooRepositiory() {
        return Mockito.mock(FooRespository.class);
    }

    @Bean
    public FooService fooService() {
        return Mockito.mock(FooService.class);
    }

    //even though we are "only" testing FooController, we still need to mock BarController's dependencies, because BarController is loaded by the web app context.
    @Bean
    public BarService barService() {
        return Mockito.mock(FooService.class);
    }

    //many more "mocks"

}

我真的不想使用standaloneSetup()(想使用生产配置,例如转换服务,错误处理程序等)

这仅仅是我编写控制器测试所必须付出的代价吗?

似乎应该有类似mock every class annotated with @Servicemock every interface that extends JpaRepository的内容

参考方案

MVC控制器通常像将模型与视图集成的粘合代码一样实现。例如,从Controller调用EJB,然后更新View模型时。

因此,当您确实模拟所有依赖项并验证此集成或“胶水代码”是否按预期工作时,Controller测试可能具有意义。通常,如果集成测试包含太多组件,则可能需要对整个软件模块进行模块化才能使系统实际可测试。

无论如何,如果您发现集成测试很麻烦,也许您可​​以尝试使每个独立组件获得最大的覆盖率,并让功能测试获得Controller的覆盖率。

Spring MVC:如何获取请求的处理程序方法 - java

我正在尝试根据Spring @RequestMapping注释方法上存在的注释实现一些逻辑。因此,我的方法中有一个HttpServletRequest实例,我想问一下spring“给我一个方法,该方法将被调用以处理此请求”,因此我可以使用反射API来询问是否存在我的注释,因此我可以更改处理。有什么简单的方法可以从Spring MVC获取此信息? java大神…

IntelliJ Spring MVC教程部署 - java

我尝试了tutorial,当我尝试部署webapp(IntelliJ 13.1.4 Ultimate)时,出现了一个奇怪的错误,如下面的屏幕快照所示。解决此错误的方法是什么? org.jdom.input.JDOMParseException: Error on line 742: The content of elements must consist o…

春季安全值得付出努力 - java

我一直在关注春季安全性,并注意到它是多么大的包装。我想知道是否值得花一些时间来加强这一点。Spring Security 2.0+为您节省了大量时间,还是以任何方式简化了您的项目? java参考方案 几年前,我考虑将其用于Spring项目,并选择了它,因为它是一个非常繁琐的框架,恕我直言,它提供的灵活性不是必需的。 (据我估计)减少我们自己的身份验证/授权的…

春天的多属性文件 - java

我在spring中加载属性文件: <context:property-placeholder location="classpath:foo.properties"/> 但是,如果我尝试在另一个上下文文件中加载另一个文件,则会出现错误。 java大神给出的解决方案 如果您需要覆盖属性,则可以执行以下操作:<context…

解析文档时如何用另一个字符串替换文档中字符串的一部分 - java

我有一个解析的PDF文档,我使用Java中的一个库进行了解析。问题是文档中的表没有正确解析,它像文本(逐行)一样被解析。因此,我在Python中使用了一个名为Camelot的库,该库为我提供了已解析的表格式,并将其发送给Java。我需要用来自Camelot的PDF解析表替换PDF解析表,并保持其余部分不变。文档中有多个表,因此已解析的表以字符串列表的形式返回…