2013-04-05 7 views
12

Prima volta qui, mi scuso se ho perso qualcosa. Spero di aggirare una chiamata a un metodo statico usando Spock. Il feedback sarebbe fantasticoMetodo statico simulato con GroovyMock o simile in Spock

Con groove di mock, ho pensato di riuscire a superare la chiamata statica ma non l'ho trovata. Per lo sfondo, sono in procinto di eseguire l'aggiornamento di test in legacy java. Il refactoring è proibito. Sto usando spock-0.7 con groovy-1.8.

La chiamata al metodo statico è concatenato con una chiamata esempio in questa forma:

public class ClassUnderTest{ 

public void methodUnderTest(Parameter param){ 
    //everything else commented out 
Thing someThing = ClassWithStatic.staticMethodThatReturnsAnInstance().instanceMethod(param); 
    } 

} 

staticMethod restituisce un'istanza di ClassWithStatic instanceMethod restituisce la cosa necessaria nel resto del metodo

Se Eseguo direttamente il simulato globale, restituisce l'istanza derisa ok:

def exerciseTheStaticMock(){ 
    given: 
    def globalMock = GroovyMock(ClassWithStatic,global: true) 
    def instanceMock = Mock(ClassWithStatic) 

    when: 
    println(ClassWithStatic.staticMethodThatReturnsAnInstance().instanceMethod(testParam)) 

    then: 
    interaction{ 
     1 * ClassWithStatic.staticMethodThatReturnsAnInstance() >> instanceMock 
     1 * instanceMock.instanceMethod(_) >> returnThing 
    } 
} 

Ma se eseguo il metho dUnderTest dal ClassUnderTest:

def failingAttemptToGetPastStatic(){ 
    given: 
    def globalMock = GroovyMock(ClassWithStatic,global: true) 
    def instanceMock = Mock(ClassWithStatic) 
    ClassUnderTest myClassUnderTest = new ClassUnderTest() 

    when: 
    myClassUnderTest.methodUnderTest(testParam) 

    then: 
    interaction{ 
     1 * ClassWithStatic.staticMethodThatReturnsAnInstance() >> instanceMock 
     1 * instanceMock.instanceMethod(_) >> returnThing 
    } 
} 

Si butta giù una vera e propria istanza di ClassWithStatic che continua a fallire nel suo instanceMethod.

+1

Se aiuta qualcuno, sto usando GroovyMock in Spock per cambiare i metodi statici nel codice Java, ma questo ha influenzato in modo errato altri test. Ho usato questa annotazione per risolvere il problema @ConfineMetaClassChanges – Topera

risposta

15

Spock può solo simulare i metodi statici implementati in Groovy. Per simulare metodi statici implementati in Java, è necessario utilizzare uno strumento come GroovyMock, PowerMock o JMockit.

PS: Dato che questi strumenti hanno bisogno di alcuni trucchi profondi per raggiungere i loro obiettivi, sarei interessato a sapere se e quanto bene funzionano insieme ai test implementati in Groovy/Spock (piuttosto che in Java/JUnit) .

+0

Grazie Peter. Avrai un'integrazione e ti farò sapere – alexgibbs

+0

Hai ricevuto una risposta? Vedo un esempio qui: https://github.com/kriegaex/Spock_PowerMock – JavaJigs

2

Ecco come ho risolto il mio problema simile (beffardo una chiamata di metodo statico che viene chiamato da un'altra classe statica) con Spock (v1.0) e PowerMock (v1.6.4)

import org.junit.Rule 
import org.powermock.core.classloader.annotations.PowerMockIgnore 
import org.powermock.core.classloader.annotations.PrepareForTest 
import org.powermock.modules.junit4.rule.PowerMockRule 
import spock.lang.Specification 
import static org.powermock.api.mockito.PowerMockito.mockStatic 
import static org.powermock.api.mockito.PowerMockito.when 

@PrepareForTest([YourStaticClass.class]) 
@PowerMockIgnore(["javax.xml.*", "ch.qos.logback.*", "org.slf4j.*"]) 
class YourSpockSpec extends Specification { 

@Rule 
Powermocked powermocked = new Powermocked(); 

def "something something something something"() { 
    mockStatic(YourStaticClass.class) 

    when: 'something something' 
    def mocked = Mock(YourClass) 
    mocked.someMethod(_) >> "return me" 

    when(YourStaticClass.someStaticMethod(xyz)).thenReturn(mocked) 

    then: 'expect something' 
    YourStaticClass.someStaticMethod(xyz).someMethod(abc) == "return me" 

    } 
} 

Il @PowerMockIgnore l'annotazione è facoltativa, usala solo se c'è qualche conflitto con le librerie esistenti