Pet*_*ter 6 grails groovy unit-testing mockito
我使用Grails 1.3.7的Mockito 1.9,我有一个奇怪的错误.
以下java中的测试用例:
import static org.mockito.Mockito.*;
public class MockitoTests extends TestCase {
@Test
public void testSomeVoidMethod(){
TestClass spy = spy(new TestClass());
doNothing().when(spy).someVoidMethod();
}
public static class TestClass {
public void someVoidMethod(){
}
}
}
Run Code Online (Sandbox Code Playgroud)
在groovy中的这个测试不起作用:
import static org.mockito.Mockito.*
public class MockitoTests extends TestCase {
public void testSomeVoidMethod() {
def testClassMock = spy(new TestClass())
doNothing().when(testClassMock).someVoidMethod()
}
}
public class TestClass{
public void someVoidMethod(){
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误消息:
only void methods can doNothing()!
Example of correct use of doNothing():
doNothing().
doThrow(new RuntimeException())
.when(mock).someVoidMethod();
Above means:
someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called
org.mockito.exceptions.base.MockitoException:
Only void methods can doNothing()!
Example of correct use of doNothing():
doNothing().
doThrow(new RuntimeException())
.when(mock).someVoidMethod();
Above means:
someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called
at org.codehaus.groovy.runtime.callsite.CallSiteArray.createPogoSite(CallSiteArray.java:129)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:146)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
Run Code Online (Sandbox Code Playgroud)
是否有人观察到同样的错误?
问题是Groovy在它到达之前拦截你的方法调用someVoidMethod.实际调用的方法getMetaClass不是void方法.
您可以通过替换来验证这种情况:
doNothing().when(testClassMock).someVoidMethod()
Run Code Online (Sandbox Code Playgroud)
有:
doReturn(testClassMock.getMetaClass()).when(testClassMock).someVoidMethod()
Run Code Online (Sandbox Code Playgroud)
我不确定你是否能够使用stock Mockito和Groovy 来解决这个问题.
| 归档时间: |
|
| 查看次数: |
3625 次 |
| 最近记录: |