2012-02-21 13 views
5

Sto usando Mockito 1.9 con Grails 1.3.7 e ho uno strano bug.Bug in Mockito con Grails/Groovy

Il seguente caso di test in Java funziona:

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

Questo test in Groovy non funziona:

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

Questo è il messaggio di errore:

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) 

Vuol anymone osservato lo stesso errore?

risposta

8

Il problema è che Groovy intercetta la chiamata del metodo prima che raggiunga someVoidMethod. Il metodo effettivamente chiamato è getMetaClass che non è un metodo di annullamento.

è possibile verificare questo sta accadendo sostituendo:

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

con:

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

io non sono sicuro che sarete in grado di aggirare questo problema utilizzando magazzino Mockito e Groovy.

+0

Che cosa dovrei usare allora? Ho lo stesso problema e sono bloccato con esso. – Guillaume

+0

Puoi provare [mockito-groovy-support] (https://github.com/cyrusinnovation/mockito-groovy-support). Ha risolto il problema getMetaClass() per me – csab