Bug in Mockito with Grails/Groovy



我将Mockito 1.9与Grails 1.3.7一起使用,但我有一个奇怪的错误。

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(){
        }
    }
}

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(){
    }
}

这是错误消息:

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)

有人观察到同样的错误吗?

问题是Groovy在方法调用到达someVoidMethod之前拦截了它。实际调用的方法是getMetaClass,它不是void方法。

您可以通过替换来验证是否发生了这种情况

doNothing().when(testClassMock).someVoidMethod()

带有:

doReturn(testClassMock.getMetaClass()).when(testClassMock).someVoidMethod()

我不确定您是否能够使用股票Mockito和Groovy来解决这个问题。

相关内容

  • 没有找到相关文章

最新更新