网上的测评都说Jmockit非常全面, 且api的一致性很好, 能自动处理@Autowired等注解试了一下,记录之
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class ClassUnderTest { private DependencyAbc abc; public void doSomething() { int n = abc.intReturningMethod(); for (int i = 0; i < n; i++) { String s = abc.stringReturningMethod("xyz" + i); System.out.println("in ClassUnderTest.doSomething() s=" + s); } } public static interface DependencyAbc { public int intReturningMethod(); public String stringReturningMethod(String p1); } } |
待注入的接口DependencyAbc有两个方法, intReturningMethod返回int, stringReturningMethod返回String, 这个接口主要是测试Jmockit的Mock功能
ClassUnderTest类需要注入ClassUnderTest的实例, 在doSomething()方法中, 先调用abc.intReturningMethod返回要执行abc.stringReturningMethod()的次数, 然后在循环中调用abc.stringReturningMethod()。
单元测试的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public class ClassUnderTestTest { @Tested ClassUnderTest cut; @Mocked @Injectable DependencyAbc abc; @Test public void doSomethingHandlesSomeCheckedException() throws Exception { final String msg = "i'm exception"; new Expectations() {{ abc.intReturningMethod(); this.result = 3; abc.stringReturningMethod(this.anyString); this.returns("javacoder.cn", "helloWorld"); this.result = new RuntimeException(msg); }}; String retMsg = null; try{ cut.doSomething(); }catch(Exception e) { retMsg = e.getMessage(); } Assert.assertEquals(retMsg, msg); new Verifications() {{ String captured; abc.stringReturningMethod(captured= withCapture()); System.out.println("in Verifications:" + captured); }}; } } |
Jmockit相关的信息如下
@Tested注解待测试的对象, 这个对象可以是具体的类, 也可以是抽象的类, 如果是抽象的类那么Jmockit会自动实现哪些抽象方法
@Mocked 表示为该注解标识的接口或者抽象类产生一个Mock对象,
@Injectable 表示该注解标识的对象是能被注入的。
1 2 3 4 5 6 7 |
new Expectations() {{ abc.intReturningMethod(); this.result = 3; abc.stringReturningMethod(this.anyString); this.returns("javacoder.cn", "helloWorld"); this.result = new RuntimeException(msg); }}; |
表示录制一个期望对象, 产生了一个Expectations的匿名子类, 在匿名子类的代码块中,指定, 如果调用intReturningMethod()方法,那么返回3,
abc.stringReturningMethod(this.anyString);表示以任意参数调动该方法, 前两次分别返回"javacoder.cn"和"helloWorld", 第三次抛出异常。(this.anyString, this.returns(), this.result都是Expectations的属性和方法, 简单看了一下源码, 最后是通过asm产生新的DependencyAbc对象 )
1 2 3 4 5 |
new Verifications() {{ String captured; abc.stringReturningMethod(captured= withCapture()); System.out.println("in Verifications:" + captured); }}; |
Verifications 原理和Expectations类似。我们调动Verifications.withCapture()来捕获传递给stringReturningMethod()方法的参数。
纵然Jmockit有千般本领,万般美好,但是spring-boot-test使用的是mockito库, 所以
goodbye Jmockit, hello mockito
Posted in: java基础
Comments are closed.