JMockit Mock 私有方法和私有属性

前面说过 JMockit 因身处前线,所以简直无不可,本节例子演示 JMockit 怎么 Mock 私有方法和私有属性,示例虽然是静态方法和属性,但因采用的是反射手法,所以这种 Deencapsulation 的 Mock 手段同样适用于公有的方法或属性,无论是否静态。

本文所用 JMockit 版本为 1.6, 可能网上所搜索的方法与此有所不同,请注意 JMockit 版本差异。仍需重复一下,运行 JMockit 的例子 classpath 上必须让 jmockit.jar 在 junit.jar 之前,或用 javaagent 参数来加载 jmockit.jar,并且 junit 要 4.8 及以上版本.

1. Mock 私有方法(非静态类似) 阅读全文 >>

JMockit 之 Expectations

TDD 推求测试先行,不光在自己代码未实现时可以先做好测试,即使平台依赖或第三方接口未准备好我们也能先行一步的,这就要对接口依赖进行 Mock。同时 Mock 也使得我们的测试代码在运行当中不至于随着第三方接口的沦陷而坠入深渊。

Java 中 Mock 工具也不少,像通用 EasyMock, jMock, Mockito, Unitils Mock, PowerMock, 再比如偏专业的 HttpMock, StrutsMock 等。但 JMock 与前面各位相比简直是全能选手,对 final/static/native/private 方法都能 Mock,功能上还远不止这些了,可以看看一个对比图 https://code.google.com/p/jmockit/wiki/MockingToolkitComparisonMatrix

JMockit 是基于 Java5 的 java.lang.instrument 包开发的,所以它才能夺得先机,也可陷得更深。自然它要求 JDK5 及以上,JUnit 4.8 及以上版本。命令行下原来用 -javaagent:/.../lib/jmockit.jar 加载 JMockit,现在发现把 jmockit.jar 放在 classpath 下就 OK 的,但是必须放在 junit.jar 包之前,否则你会看到这个 java.lang.IllegalStateException: JMockit wasn't properly initialized; check that jmockit.jar precedes junit.jar in the classpath。 JMockit 有两种 Mock 方式:

1. Behavior-oriented(Expectations & Verifications)  --- 基于代码执行行为的模仿,象黑盒测试
2. State-oriented(MockUp<GenericType>)   --- 侵入类内部,随意模仿,似白盒,可以说是能为所欲为

此篇体验下第一种 Mock 方式,在测试代码中最直观就是那个 new Expectations(...){{result = some;}},下面来看个实际的例子。应用场景是 阅读全文 >>

SQLite 使用主键,ROWID 及自增列

之前关注过一些嵌入式数据库,倒时 SQLite 风头更劲,在 Android 上被应用,在 HTML5 中一些浏览器的 Local Database 的实现也是 SQLite。因在 PhoneGap 中使用数据库存储的选择也期待着它的表现,首先要建个数据库,第一要义就是主键的选择,自增列是最有效更简单的。

这里就看下 SQLite 怎么使用自动列,了解三个内容,ROWID, ROWID 的别名,自动列与序列表,归根结底它们都是 ROWID。

1. ROWID

每个表默认都有 rowid 列,除非创建表时指定了 WITHOUT ROWID, 它现在是 64 位长的。在查询时用 select * from table1 里没有它,要显式的用 select rowid, * from table1 就会列出它来。

2. ROWID 的别名 阅读全文 >>

Using Network Link Conditioner in iOS 6

来到芝加哥后好久没写博客了,有些文章本想翻译后介绍给大家,可如今越发没先前那翻译的意愿了,所以不妨直接贴出原文如下:

I previously covered using Network Link Conditioner to test how your app does in less-than-ideal network scenarios. One of the inconveniences of using it is in order to test your app on a device, you have to take the extra steps to configure a proxy on your computer that your device can connect to over a wi-fi connection. Well, not anymore. With iOS 6, Apple has given us Network Link Conditioner right on the device.

To get started with Network Link Conditioner, first your device must be set up as a developer device. If you haven’t done this yet, you’ll need to go to Xcode, open Organizer (Shift-Command-2), select your device, and click the button that says Use for Development to add the device your developer account. Once you’ve done that, you should be able to open Settings on your device and see a Developer menu near the bottom, just above the apps list. Tapping on that reveals some helpful settings, Network Link Conditioner Status obviously being the one relevant to our interests here. 阅读全文 >>

扩展 JUnit 4,使用定制的 Runner

JUnit 的测试用例总是由 Runner 去执行,JUnit 提供了 @RunWith 这个测试类的 Annotation, 可来指定自定义的 Runner。如果未指定特别的  Runner,那么会采用默认的 Runner,可能不同的环境,如 Eclipse,控制台下会有不同的默认 Runner。

如果不清楚 Runner 是什么,那么可能见过 @RunWith(SpringJUnit4ClassRunner.class) 这个东西,它有助你加载 Spring 的配置文件,及与 Spring 相关的事物。

那么自定义的 Runner 有什么用呢?它可以截获到 @BeforeClass, @AfterClass, @Before, @After 这些事件,也就是能在测试类开始和结束执行前后,每个测试方法的执行前后处理点事情。

比如说从外部读取内容进行初始化测试数据,而且 JUnit 本身就提供了 @RunWith(Parameterized.class)  这个参数化 Runner,用了为带参数测试方法循环填充数据进行测试。JUnit 的参数化测试比 C# 还是要笨拙一些,C# 直接用方法注解一行行设置参数,我想 JUnit 稍加定制的话也行的。 阅读全文 >>

Objective-C 类方法 load 和 initialize 的区别

过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method)。它们的特别之处,在于iOS会在运行期提前并且自动调用这两个方法,而且很多对于类方法的规则(比如继承,类别(Category))都有不同的处理。

而因为这两个方法是在程序运行一开始就被调用的方法,我们可以利用他们在类被使用前,做一些预处理工作。比如我碰到的就是让类自动将自身类名保存到一个NSDictionary中。

先来看看NSObject Class Reference里对这两个方法说明:

+(void)initialize

The runtime sends initialize to each class in a program exactly one time just before the class, or any class that inherits from it, is sent its first message from within the program. (Thus the method may never be invoked if the class is not used.) The runtime sends the initialize message to classes in a thread-safe manner. Superclasses receive this message before their subclasses.

+(void)load

The load message is sent to classes and categories that are both dynamically loaded and statically linked, but only if the newly loaded class or category implements a method that can respond.
The order of initialization is as follows: 阅读全文 >>

Scala 特质(trait) 的 super 方法调用是动态绑定的

在 Java 或者 Scala 的类中,super.foo() 这样的方法调用是静态绑定的,也就是说当你在代码中写下 super.foo() 的时候就能明确是调用它的父类的 foo() 方法。然而,如果是在特质中写下了 super.foo() 时,它的调用是动态绑定的。调用的实现奖在每一次特质被混入到具体类的时候才被决定。

确切的讲,特质的 super 调用与混入的次序很重要,参照下面的例子说话:

直截的讲就是超靠近后面的特质越优先起作用。当你调用带混入的类的方法是,最右侧特质的方法首先被调用。如果那个方法调用了 super,它调用其左侧特质的方法。可以这么认为,Doubling 的 super 指向了  Incrementing,Incrementing 的 super 指向了 BasicIntQueue。

来看个完整的实例实际体验一把,如果要帮助理解,最好应该实际运行一下这个实例 阅读全文 >>

JUnit 4 如何正确测试异常

本篇讲述如何在 JUnit 4 下正确测试异常,我会从 try..catch 的方式谈起,然后说到 @Test(expected=Exception.class), 最后论及 @Rules public ExpectedException 的实现方式,最终基本可确定用 @Rules 是最方便的。

我们在用 JUnit 测试方法异常的时候,最容易想到的办法就是用 try...catch 去捕获异常,需要断言以下几个条件:

1. 确实抛出的异常
2. 抛出异常的 Class 类型
3. 抛出异常的具体类型,一般检查异常的 message 属性中包含的字符串的断定

所以常用的代码你可能会这么写:

这里被测试的方法是 Password.validate() 方法是否抛出了相应的异常,注意这里别漏 try 中的

fail("No Exception thrown.") 阅读全文 >>

WordPress Code Editor 插件让你在线编辑主题/插件即时语法高亮

晚上找了一些时候在线的即时语加亮组件,很多的,在线的代码编辑器就语法即时高亮上都可与客户端的编辑器相媲美了。有商业的,功能很丰富的,也有开源的,像 CodePress,   就很简单它支持 PHP, JavaScript, Java, Perl, SQL, HTML 和 CSS 代码的即时着色,完全由 JavaScript 来进行渲染。

顺着 CodePress 来搜索,恰好还找到一个能让我们在 WordPress 的后台在线编辑插件/主题的代码编辑框中实现语法着色,并且时编辑时实时语法着色哦,那就是插件:WordPress Plugin Code Editor,可以点击 Code Editor  链接下载并安装为 WordPress 的插件。

安装完启用后,使能看到编辑插件/主题时的代码都高亮了,使代码的可读性大大增加,编辑时即时的效果,能让你修改代码时出错的几率明显降低。 阅读全文 >>

iOS 开发中使用正则表达式-暨 RegexKitLite 库的用法

在 iOS 开发中要用正则表达式的话,至少有三种选择:

1. 系统自带的  NSString 和 NSMutableString 相关的方法
2. RegexKit Framework - http://regexkit.sourceforge.net
3. RegexKitLite - http://regexkit.sourceforge.net/RegexKitLite/

NSString 和 NSMutableString 里像

带有 NSStringCompareOptions 参数的方法就可以支持正则表达式,只要对于 NSStringCompareOptions 参数取值中含有 NSRegularExpressionSearch 这个 Mask 值即可。

RegexKit Framework 用的是 PCRE(Perl Compatible Regular Expressions) 库,可能是我们熟悉正则表达式语法,但需要引入 PCRE 静态库。

RegexKitLite,看链接它与 RegexKit Framework 出自一家,但它用的是 Mac 自带的 ICU(International Components for Unicode) 库,所以语法上与 RegexKit Framework 是不一样的,且引入它也较简单。 阅读全文 >>