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