Java 是否可以在嵌入式Tomcat中运行的webapp中模拟类?

Java 是否可以在嵌入式Tomcat中运行的webapp中模拟类?,java,tomcat,web-applications,junit,jmockit,Java,Tomcat,Web Applications,Junit,Jmockit,我希望能够在运行嵌入式Tomcat的JUnit测试中模拟webapp使用的类 public interface Foo { void bar(); } @RunWith(JMockit.class) public class IntegrationTest { @Test public void mockingFoo(@Capturing final Foo foo) throws ServletException, LifecycleExce

我希望能够在运行嵌入式Tomcat的JUnit测试中模拟webapp使用的类

public interface Foo {
    void bar();
}

@RunWith(JMockit.class)
public class IntegrationTest {

    @Test
    public void mockingFoo(@Capturing final Foo foo)
            throws ServletException, LifecycleException {

        new Expectations() {{
            foo.bar(); result = new RuntimeException();
        }};

        final Tomcat tomcat = new Tomcat();

        // MyApp will invoke a Foo instance
        tomcat.addWebapp("/MyApp", "/path/to/MyApp.war");

        tomcat.start();

        /* 
        invoke the webapp (via Selenium, for example)
        The call to Foo::bar in the webapp should throw the runtime exception 
        */

        tomcat.stop();
    }
}
如何通过JMockit模拟webapp中的
Foo
实例

更新-20150821


我还不知道我的问题的答案。但是,我还是设法做到了。

如果您打算编写一个功能性的web UI测试(使用HTMLUnit或Selenium WebDriver),为什么要模拟任何东西呢?这种测试是端到端的;通常情况下,他们访问外部资源,比如数据库,甚至提交事务,那么模拟的用途是什么呢?我想模拟业务层。它已经过测试。我想对webapp层进行集成(?)测试。也就是说,我想以多组测试结束:业务层测试(与任何技术堆栈隔离)和集成测试,用于我需要围绕业务层的任何技术适配器。嗯,是的,这是一种有效的测试策略,但我可以看到一些问题:1)你不会有真正的验收/功能测试(因为没有一个单独的测试可以测试给定用例场景中涉及的所有应用程序代码);2)创建和运行两个测试套件的工作量将大于具有相同代码覆盖率的单个测试套件的工作量。根据经验,我知道1)某些bug只能(或更容易)通过真正的端到端测试来检测;2)web UI测试(尤其是使用WebDriver)运行起来非常困难(不仅仅是创建它们)。(继续)我的首选方法(在JavaEE7Web应用程序中使用它)是为应用程序、域和基础结构层编写一套集成测试(使用DDD),同时保留UI层(JSF.xhtml文件)尽可能缺乏逻辑;我不使用像HTMLUnit或WebDriver这样的工具,因为运行这样的测试很痛苦;不管怎样,对UI的可视化检查更有效,即使这意味着一些应用程序代码没有被自动化测试覆盖。我欣赏单一测试套件的方法。然而,即使您对整个应用程序只有一个测试套件,您也可能需要在某个地方引入mock,特别是对于您无法控制的数据源。话虽如此,我还是喜欢为每一层独立地进行一组测试,这样1。由于涉及的代码量减少,因此跟踪问题更容易2。我发现重新创建错误条件更容易。