是否可以不使用Spring而为基于Servlet的应用程序运行JUnit测试?

c0vxltue  于 2023-02-08  发布在  Spring
关注(0)|答案(1)|浏览(144)

我需要为在Tomcat Servlet容器中运行的Web应用程序运行单元测试。我已经运行了一些不需要数据库连接的测试,并且它们的执行没有任何问题。现在的问题是,当测试需要使用数据源建立数据库连接时。对于应用程序的结构,将数据源放在servletContext中,如下所示:

public void contextInitialized(ServletContextEvent sce) {
        ServletContext sc = sce.getServletContext();
        DataSource ds;
        Context initCtx;

        try {
            initCtx = new InitialContext();
            Context envCtx = (Context) initCtx.lookup("java:comp/env");
            ds = (DataSource) envCtx.lookup("jndiResourceName");
            sc.setAttribute("DataSource", ds);
        } catch (NamingException e) {
            logger.log(Level.SEVERE, e.getMessage());
        }
    }

当我用JUnit运行测试时,servletContext不可用,有什么方法可以克服这个问题吗?
我已经尝试使用TomcatJNDI加载web.xml和context.xml文件,以便重新创建JNDI环境,但没有任何成功。

v64noz0r

v64noz0r1#

首先,关于不同测试级别的一般提示。区分三个级别是非常常见的:
1.单元测试-关注于测试单个代码单元,通常不与其他单元交互。在Java中,这通常是类。
1.集成测试--这是关于测试当它们放在一起时是如何工作的。这跨越了多个单元,可以同时测试你的代码和数据库。
1.功能测试-这是关于测试您的软件产品的功能,如广告给用户。对于一个网络应用程序,这包括使用网络浏览器连接到您的网络应用程序。
这只是一个指导原则。在您的项目中,您可以决定使用更多/更少的级别。许多测试框架,包括JUnit,都提供了对这些级别中任何一个级别的测试的支持。像分组测试这样的特性可以帮助您将测试组织到不同的级别。这取决于您如何使用它。单元测试将需要非常少的设置。集成测试通常需要更多的设置工作。比如连接到数据库,并在每次测试后重置测试数据。功能测试需要启动servlet容器,并部署webapp。
通过上面描述的不同级别的测试,我理解您正在尝试进行集成测试,如果不是功能测试的话。
在我们的项目中,对于集成测试,我们从Flyway的Repeated Migrations功能中获益匪浅。对于功能测试,我们使用Gretty(Gradle插件)启动servlet容器,并使用Geb实现浏览器自动化。

相关问题