Java

jmockit中的诡异陷阱

以前用过一些Mock框架;使用jmockit时,我以为mock框架都差不多,jmockit也不例外。吃了一些苦头才发现,jmockit是多么的与众不同(中性词). 在我看来,jmockit作者的思维方式是扭曲的,jmockit的用法也是诡异的。要想充分利用jmockit的强大功能,你必须容忍它与众不同的地方。本文给出一些最近收集到的诡异点: Mock行为中的诡异点 看起来只Mock了一个对象,实际上Mock了整个类 @Mocked //看起来只Mock了bean这个对象 private SimpleBean bean; @Test public void test_MockedInstance() throws Exception { bean.throwException(); // 不会报异常,因为bean已经被mock了. 这个好理解. } @Test public void test_AnotherInstance() throws Exception { SimpleBean bean2 = new SimpleBean(); bean2.throwException(); // 也不会报异常,因为SimpleBean的任何一个实例都被Mock了。想不到吧? } 看起来只Mock了本类,实际上这个类的父类及所有祖先类都被Mock了 @Mocked private SubSimpleBean bean; //看起来只Mock了SubSimpleBean类 @Test public void test_AnotherInstance() throws Exception { SimpleBean bean2 = new SimpleBean(); //SubSimpleBean的父类 bean2.throwException(); …

jmockit中的诡异陷阱 Read More »

从“构建、发布java程序”的角度看待OO Principles

这里的OO Principles是指Robert C. Martin提出的那一系列原则,如SRP,OCP等; 本文旨在从构建、发布java程序的角度理解这些原则,更具体一点,就是 要找出违背这些原则会对java程序的构建、发布等过程造成什么困扰。 首先可以先罗列一下构建、发布过程中可能出现的坏现象: 1. 编译、打包时间过长 2. 打出的包过大,导致网络传输久、应用启动慢、虚拟机方法区空间被浪费 3. 打出的包里有相同的库,如spring 2.5和spring2.0同时出现 4. 频繁发布应用,浪费时间,影响可用性 5. 做太多的回归测试 6. 发布前夕发现错误,不得不回滚 待续。。。 接下来进入正题, 逐个看下违反OO Principle的后果 (我们会用 caller代表模块的调用者, callee代表被调用的模块) 1. 违反SRP 场景: callee有两个互不相关的职责r1, r2; caller1依赖r1, caller2依赖r2. 后果:    a. caller因为callee中的无关代码而浪费构建自己的时间和空间。caller1与callee共同编译时,也需要编译r2相关的代码;但r2部分的代码caller1并不需要,这就意味着编译时间和打包空间的浪费  — 当然,这个浪费可能很小    b. caller因为callee中的无关第三方库,而浪费构建自己的时间和空间。 如果r2依赖了一些第三方库,而这些库又依赖了另一些第三库,打包caller1时就要把这些只能r2相关的第三方库统统纳入进来,造成打包时间过长、打出的包过大    c. 第三方库太多增加了callee包中库冲突的几率。如果r1依赖了spring 2.5, r2依赖了spring 2.0,callee在打包前就必须进行依赖调解,即两个spring只能留一个;你要么手动确定留哪个,要么通过Maven之类的依赖管理工具来处理;但不管怎么搞,都会比较繁琐,并且带来风险(maven环境中,一个极端情况就是,r1使用了官方的spring坐标,而r2使用了一个山寨的spring坐标)    d. callee的部分升级导致无关caller的回归测试。为了满足caller2的新功能,r2被升级了,这也意味着整个callee的升级;如果callee没有版本机制,则callee的更新会导致caller1不得不接受新的callee,并不得不做一下回归测试    e. callee的部分升级导致无关caller在callee发布时不可用。如果callee是一个web …

从“构建、发布java程序”的角度看待OO Principles Read More »

java.util.List与null对象

List list = new ArrayList(); System.out.println(list.size()); // 0 System.out.println(list.isEmpty()); // 1 System.out.println(list.get(0)); // java.lang.IndexOutOfBoundsException list.add(null); System.out.println(list.size()); // 1 System.out.println(list.isEmpty()); // false System.out.println(list.get(0)); // null

Velocity Template Language: The unknown story

例示velocity模板语言中的一些陷阱 objects, strings, quotes #set ($var = $list) $var.class, $var   ## java.util.List, list.toString() #set ($var = ‘$list’) $var.class, $var   ## java.lang.String, "$list"  #set ($var = "$list") $var.class, $var   ## java.lang.String, list.toString()     ——————————— public field not treated as property $publicFieldBean.publicField    ##won’t work; velocity doesn’t recognize public fields as properties ——————————— maps are also supported $map.firstKey, …

Velocity Template Language: The unknown story Read More »

tomcat里定义jndi datasource

文档在这里  http://www.pdh.sh.cn/docs/jndi-datasource-examples-howto.html 注意事项: 1.要记得把jdbc driver的jar文件复制到tomcat的lib目录下 2.很恶心的一点: web.xml也得改 — 应用被侵入 3.更恶心的一点: 名为"jdbc/TestDB"的resource的全名将是 "java:/comp/env/jdbc/TestDB",因为tomcat会强行加上"java:/comp/env/"前缀,而且不能配置。所以,你的应用里的jndi name也得使用"java:/comp/env/jdbc/TestDB"这种全名; 如果你现有应用里的jndi name不是以"java:/comp/env/"开头的,而你又不方便改变它。。。

笔记:搭建memcached集群环境并通过java客户端访问它

今天在CentOS 5.7 上搭建了memcahced集群环境,并通过Xmemcached这个java client写了一个程序。步骤如下: 1. CentOS上添加EPEL仓库,这样才能用yum安装memcached su -c ‘rpm -Uvh http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm’ 2. 安装memcached yum install memcached 3. 在另一台机器上重复#1, #2,安装另一个memcached; 当然这不是必须的,你也可以在一台机上跑两个memcached实例。 具体参考memcached的参数 4. 启动memcached,即成memcached cluster service start memcached -l 192.68.1.1 #本机ip service start memcached -l 192.68.1.2 5. 客户端通过Xmemcached访问这个集群 去 http://code.google.com/p/xmemcached/搞定jar包或maven依赖 XMemcachedClient client = new XMemcachedClient( AddrUtil.getAddresses("192.168.1.1:11211 192.168.1.2:11211")); String userId = "1"; Object user = client.get(userId); if (user …

笔记:搭建memcached集群环境并通过java客户端访问它 Read More »

memcached的监控工具

1. telnet memcachedServer 11211 ,然后输入指令获得信息 2. 用 http://code.google.com/p/statsproxy/ 为每个memcached结点搭建一个web界面 3. 如果想监控整个集群,可以用一个不知名的工具: http://livebookmark.net/memcachephp/memcachephp.zip,基于php的memcached monitor. 作者叫:Harun Yayli

memcached的一些特性

1. Memcached是用c/c++语言写的服务器程序,在linux下安装后可以用作daemon服务,这一点跟mysql很像 2. Memcached提供了一套通信协议,Memcached客户端通过这个协议与Memcached服务器进行交互。这个协议是开放的,只要遵循这个协议,任何人可以用任何语言写一个客户端 3. 系统方面    a.Memcached就是用来占内存的,所以机器的内存越充裕越好。    b.如果内存存取“慢”了,Memcached就会非常慢。所以,如果你的Linux用上了虚拟内存开始swap了,你的Memcached就会很弱    c.对CPU的压力不大    d.为了避免给网络带来压力,你的缓存项最好都是小数据 4. Memcached集群    a.多个memcached实例一起使用即构成集群。集群的前面并没有前置任何负载均衡或者其它管理集群的东西,集群的结点之间也不会互相通信。    b.结点之间不会复制数据,一个缓存entry只存一台机器;所以取entry时,客户端自己要知道该去哪台机取    c.客户端存取缓存项前一般会根据key值决定去哪个结点,这个函数 node = f(key) 称为hashing函数。 最简单的策略是 node = hash(key)/size-of-node,即简单哈希后再用结点数取模    d.基于结点数取模的寻址策略有个缺点,即在结点数增加时,几乎所有key的hashing值都会变化; 如果增加结点前某个缓存项存在A结点上,增加结点后,由于hashing值的变化,客户端可能会去到B结点读取这个缓存项,结果没读到,缓存的命中率下降。 解决办法是使用Consistent Hashing算法,使用了这种算法后,在遇到增减结点时,只有少部分key的hashing值会变化    e.客户端还可以自己实现“权重”,即有的机器多收一点缓存,有的少收一点 5. 高级操作   a. 支持add操作,即当key相同的缓存项不存在时,才会将客户端提交的缓存项保存  b. 支持cas操作(Check And Set),即乐观锁。应用这种机制时,如果你上次访问某缓存后有它人更新了些缓存,那你再更新缓存就会失败

jar依赖环境下,被依赖的库中的枚举类如果调整枚举顺序会对依赖者产生什么影响?

问题:jar依赖环境下,被依赖的库中的枚举类如果调整枚举顺序会对依赖者产生什么影响? 只所以问这个问题,是因为我不确定枚举项会不会编译到依赖者bytecode的常量区里。如果会,则被依赖库的修改影响不到依赖者。 答案是:依赖者将完全参照被依赖者里的定义来行事,不存在常量区的问题。 ============================场景一:先Hello,再World============================= b.jar里面有个枚举EnumInB.java public enum EnumInB { HELLO("Hello"), WORLD("World"); private String displayText; private EnumInB(String displayText){ this.displayText = displayText; } public String getDisplayText() { return displayText; } } a.jar依赖b.jar,且其中有个类依赖了EnumInB 让它打印一下各个枚举项的值 public class PlayEnumInB { public static void main(String[] args) { System.out.println(EnumInB.HELLO.name() + "-" + EnumInB.HELLO.getDisplayText() + "-" + EnumInB.HELLO.ordinal()); //HELLO-Hello-0 System.out.println(EnumInB.WORLD.name() + "-" + EnumInB.WORLD.getDisplayText() …

jar依赖环境下,被依赖的库中的枚举类如果调整枚举顺序会对依赖者产生什么影响? Read More »