junit rule_Tomcat上下文JUnit @Rule

junit rule

创建测试上下文的JUnit @Rule的初稿。 这可以用Spring上下文规则可用于 这个帖子 创建集成测试一个完整的Spring上下文。
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.log4j.Logger;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
import java.lang.reflect.Method;
import java.sql.Driver;
import java.sql.DriverManager;/*** Creates an context for tests using an Apache Tomcat server.xml.** https://blogs.oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit** @author alex.collins*/
public class TomcatContextRule implements TestRule {public static final Logger LOGGER = Logger.getLogger(CatalinaContextRule.class);/*** Creates all the sub-contexts for a name.*/public static void createSubContexts(Context ctx, String name) {String subContext = '';for (String x : name.substring(0, name.lastIndexOf('/')).split('/')) {subContext += x;try {ctx.createSubcontext(subContext);} catch (NamingException e) {// nop}subContext += '/';}}private final File serverXml;public TomcatContextRule(File serverXml, Object target) {if (serverXml == null || !serverXml.isFile()) {throw new IllegalArgumentException();}if (target == null) {throw new IllegalArgumentException();}this.serverXml = serverXml;}public Statement apply(final Statement statement, Description description) {return new Statement() {@Overridepublic void evaluate() throws Throwable {createInitialContext();try {statement.evaluate();} finally {destroyInitialContext();}}};}private void createInitialContext() throws Exception {LOGGER.info('creating context');System.setProperty(Context.INITIAL_CONTEXT_FACTORY, org.apache.naming.java.javaURLContextFactory.class.getName());System.setProperty(Context.URL_PKG_PREFIXES, 'org.apache.naming');final InitialContext ic = new InitialContext();createSubContexts(ic, 'java:/comp/env');final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();final DocumentBuilder builder = factory.newDocumentBuilder();final Document document = builder.parse(serverXml);// create Environment{final NodeList envs = document.getElementsByTagName('Environment');for (int i = 0; i < envs.getLength(); i++) {final Element env = (Element)envs.item(i); // must be Elementfinal String name = 'java:comp/env/' + env.getAttribute('name');final Object instance = Class.forName(env.getAttribute('type')).getConstructor(String.class).newInstance(env.getAttribute('value'));LOGGER.info('binding ' + name + ' <' + instance + '>');createSubContexts(ic, name);ic.bind(name, instance);}}// Resource{final NodeList resources = document.getElementsByTagName('Resource');for (int i = 0; i < resources.getLength(); i++) {final Element resource = (Element)resources.item(i); // must be Elementfinal String name = 'java:comp/env/' + resource.getAttribute('name');final Class<?> type = Class.forName(resource.getAttribute('type'));final Object instance;if (type.equals(DataSource.class)) {{@SuppressWarnings('unchecked') // this mus be driver?final Class<? extends Driver> driverClass = (Class<? extends Driver>) Class.forName(resource.getAttribute('driverClassName'));DriverManager.registerDriver(driverClass.newInstance());}final BasicDataSource dataSource = new BasicDataSource();// find all the bean attributes and set them use some reflectionfor (Method method : dataSource.getClass().getMethods()) {if (!method.getName().matches('^set.*')) {continue;}final String x = method.getName().substring(3, 4).toLowerCase() + method.getName().substring(4);if (!resource.hasAttribute(x)) {continue;}Class<?> y = method.getParameterTypes()[0]; // might be primitiveif (y.isPrimitive()) {if (y.getName().equals('boolean')) y = Boolean.class;if (y.getName().equals('byte')) y = Byte.class;if (y.getName().equals('char')) y = Character.class;if (y.getName().equals('double')) y = Double.class;if (y.getName().equals('float')) y = Float.class;if (y.getName().equals('int')) y = Integer.class;if (y.getName().equals('long')) y = Long.class;if (y.getName().equals('short')) y = Short.class;if (y.getName().equals('void')) y = Void.class;}method.invoke(dataSource, y.getConstructor(String.class).newInstance(resource.getAttribute(x)));}instance = dataSource;} else {// not supported, yet...throw new AssertionError('type ' + type + ' not supported');}LOGGER.info('binding ' + name + ' <' + instance + '>');createSubContexts(ic, name);ic.bind(name, instance);}}}private void destroyInitialContext() {System.clearProperty(Context.INITIAL_CONTEXT_FACTORY);System.clearProperty(Context.URL_PKG_PREFIXES);LOGGER.info('context destroyed');}}

例如:

@Rulepublic TestRule rules = RuleChain.outerRule(new CatalinaContextRule(new File(getClass().getResource('/server.xml').getFile()), this)).around(new ContextRule(new String[] {'/applicationContext.xml'}, this));

这段代码在Github上 。

参考:来自我们的JCG合作伙伴 Alex Collins的Tomcat Context JUnit @Rule ,位于Alex Collins的博客博客中。


翻译自: https://www.javacodegeeks.com/2012/07/tomcat-context-junit-rule.html

junit rule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.31-浅析webpack源码之doResolve事件流(3)

放个流程图&#xff1a; 这里也放一下request对象内容&#xff0c;这节完事后如下(把vue-cli的package.json也复制过来了)&#xff1a; /*{ context: { issuer: , compiler: undefined },path: d:\\workspace\\doc,request: ./input.js,query: ,module: false,directory: false…

mysql数据库txt备份linux_linux备份mysql数据库

MYSQL定期备份是一项重要的工作&#xff0c;但人工操作太繁琐&#xff0c;也难避免有所疏漏&#xff0c;使用下面的方法即可让系统定期备份数据。1、创建备份文件夹#cd /www#makedir backup2、编写运行脚本#vi autobackup写入以下内容&#xff1a;filenamedate %Y%m%dmysql_bin…

python序列操作函数有哪些_Python笔记--序列操作函数

1All()&#xff1a;判断给出的可迭代参数iterable中所有元素是否均为true&#xff0c;是则返回true&#xff0c;否则返回false。注&#xff1a;除了0&#xff0c;空&#xff0c;False外都算作true。空元组&#xff0c;空列表返回true。语法&#xff1a;all(iterable)参数&#…

c++ 虚函数,纯虚函数的本质区别

转载博客&#xff1a;https://mp.weixin.qq.com/s?__bizMzAxNzYzMTU0Ng&amp;mid2651289202&amp;idx1&amp;sn431ffd1fae4823366a50b68aed2838d4&amp;chksm80114627b766cf31f72018ef5f1fe29591e9f6f4bd72018e7aea849342ca6f0a271fb38465ae#rd 学习C的多态性&…

mysql数据库常用名词_【千寻】MySQL数据库名词注释(持续更新)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼MySQL 数据库名词注释↓account 帐号数据库my 角色信息数据库mysql mysql用户数据库accountmy这两个数据库可能合并为一个数据库 比如 my my1 top top1 ... 这种类似account表打开后列 id 这个是数据库默认递增的id 不可随便列…

spring jmx_JMX和Spring –第3部分

spring jmx本文是本系列的最后一篇。 看一下第1 部分和第2部分 。 在本系列的最后一篇文章中&#xff0c;我将展示如何在JDK中使用本机JMX支持来实现一种通知机制&#xff0c;该机制可以在HEAP内存超过特定阈值时向侦听器发出警报。 正如我在上一篇文章中讨论的那样&#xff0…

云通讯短信验证码实例

1.注册登录云通讯 http://www.yuntongxun.com/user/login 2.创建应用得到应用相关信息 3.下载对应相关的Demo示例  http://www.yuntongxun.com/doc/rest/sms/3_2_2_3.html 4.send.php文件添加代码方便后续操作 session_start(); //随机验证码 $code rand(100000,999999)…

java 数组 内存_图解Java数组的内存分配

1. Java数组是静态的Java是静态语言&#xff0c;所以Java的数组也是静态的&#xff0c;即&#xff1a;数组被初始化后&#xff0c;长度不可变静态初始化&#xff1a;显式指定每个数组元素的初始值&#xff0c;系统决定数组长度String[] books new String[]{"疯狂Java讲义…

libgdx和Kotlin –类[2D平台原型]

这篇文章是libgdx和Kotlin文章的后续文章。 我已经决定开发一个简单的2D平台程序的原型&#xff08;沿着我的早期文章中的Star Assault进行介绍&#xff09;&#xff0c;但是我一直在使用和学习Kotlin&#xff0c;而不是Java。 对于本教程&#xff0c;该项目应处于上一篇文章…

Python 基础 - 4.3 random模块

程序中有很多地方需要用到随机字符&#xff0c;比如登录网站的随机验证码&#xff0c;通过random模块可以很容易生成随机字符串 >>> random.randomrange(1,10) #返回1-10之间的一个随机数&#xff0c;不包括10 >>> random.randomint(1,10) #返回1-10之间的一…

java中的方法在哪里_Java中的本机方法是什么,应在哪里使用?

小编典典Java中的本机方法是什么&#xff0c;应在哪里使用&#xff1f;一旦看到一个小例子&#xff0c;就很清楚了&#xff1a;Main.java &#xff1a;public class Main {public native int intMethod(int i);public static void main(String[] args) {System.loadLibrary(&qu…

python下载大文件

1. wget def download_big_file_with_wget(url, target_file_name):"""使用wget下载大文件Note: 需要系统安装wget"""import osimport subprocessdownload_process subprocess.Popen(["wget", "-c", "-O", targe…

spring jmx_JMX和Spring –第2部分

spring jmx这篇文章从本教程的第1部分继续。 嗨&#xff0c;在我的上一篇文章中&#xff0c;我解释了如何通过Spring设置JMX服务器以及如何通过身份验证和授权保护对它的访问。 在本文中&#xff0c;我将展示如何实现一个简单的MBean&#xff0c;该MBean允许用户在运行时更改L…

java callable用法_在Java中使用Callable和Future

最近&#xff0c;我们正在开发一个监控仪表板&#xff0c;我们想要ping几个第三方服务器&#xff0c;只是为了检查它们的可用性&#xff0c;或者我们想要调用健康检查。我们正在对服务器进行一系列api调用&#xff0c;这些服务器的IP&#xff0c;用户名和密码被外部化为环境变量…

注意Java 8的[Pri​​mitive] Stream.iterate()中的递归

Tagir Valeev关于Stack Overflow的一个有趣问题最近引起了我的注意。 为了简短起见&#xff08;请阅读问题的详细信息&#xff09;&#xff0c;而以下代码则有效&#xff1a; public static Stream<Long> longs() {return Stream.iterate(1L, i ->1L longs().skip(i…

用java编写生产者消费者问题_用java代码实现生产者和消费者的问题

public class ThreadDemo12 {public static void main(String[] args) {goods gnew goods();Product pronew Product(g);Thread th1new Thread(pro);th1.start();Customer cusnew Customer(g);Thread th2new Thread(cus);th2.start();}}/*** 商品类* author Al菜菜**/class goo…

LeetCode:位运算实现加法

LeetCode&#xff1a;位运算实现加法 写在前面 位运算符 实现加法的思路 两个加数&#xff0c;比如5(101)和6(110)&#xff0c;如何不用加法就能得出两者之和呢&#xff1f; 我们知道二进制计算中&#xff0c;如果使用异或将会产生无进位的两者之和&#xff0c;而两数相与将会产…

[机器学习] 模型评价参数,准确率,召回率,F1-score

很久很久以前&#xff0c;我还是有个建筑梦的大二少年&#xff0c;有一天&#xff0c;讲图的老师看了眼我的设计图&#xff0c;说&#xff1a;“我觉得你这个设计做得很紧张”&#xff0c;当时我就崩溃&#xff0c;对紧张不紧张这样的评价标准理解无能。多年后我终于明白老师当…

Stackoverflow的见解:投票最多的是Spring 4问题

在Stackoverflow上对Spring 4问题进行最投票和回答最多的是什么&#xff1f; 以下是最常见的五个问题和解答。 Spring中的 Component&#xff0c; Controller&#xff0c; Repository和Service批注有什么区别&#xff0c;它们可以互换使用还是具有特定功能&#xff1f; Trans…

java记录登陆时间_Spring security如何实现记录用户登录时间功能

一、原理分析spring security提供了一个接口 AuthenticationSuccessHandler,该接口中只有一个方法&#xff0c;用来进行登录成功后的操作public interface AuthenticationSuccessHandler {/*** Called when a user has been successfully authenticated.** param request the r…