2015-12-06 28 views
6

Può spock finte classi finali? Se é cosi, come? I risultati della ricerca hanno portato questo gist, che sembrerebbe implicare così, ma non riesco a trovare alcun esempio di farlo. Ho anche trovato post sul forum che dicono che il mocking delle classi finali non è supportato.Mock final class in Spock

+0

A volte, con Groovy è meglio fare un tentativo. – cjstehno

+0

@cjstehno Ho provato e ottenuto un'eccezione. Ma ho pensato che forse c'è un modo speciale di farlo che non conosco. –

+0

La mia risposta risolve il problema? – Opal

risposta

14

Questa specifica:

@Grab('org.spockframework:spock-core:1.0-groovy-2.4') 
@Grab('cglib:cglib-nodep:3.1') 

import spock.lang.* 

class Test extends Specification { 
    def 'lol'() { 
     given: 
     def s = Mock(String) { 
      size() >> 10 
     } 

     expect: 
     s.size() == 10   
    } 
} 

termina con la seguente eccezione:

JUnit 4 Runner, Tests: 1, Failures: 1, Time: 29 Test Failure: 
lol(Test) org.spockframework.mock.CannotCreateMockException: 
Cannot create mock for class java.lang.String because Java mocks cannot mock final classes. 
If the code under test is written in Groovy, use Groovy mock. 

La soluzione è quella di utilizzare GroovyMock:

@Grab('org.spockframework:spock-core:1.0-groovy-2.4') 
@Grab('cglib:cglib-nodep:3.1') 

import spock.lang.* 

class Test extends Specification { 
    def 'lol'() { 
     given: 
     def s = GroovyMock(String) { 
      size() >> 10 
     } 

     expect: 
     s.size() == 10   
    } 
} 

che funziona bene.

+0

Qualche idea sul perché questo non funzioni per String.length()? –

+0

La differenza con String.length() può essere dovuta al fatto che è definita sulla classe String di Java, non sulla versione di Groovy? Questa [risposta] (http://stackoverflow.com/a/12177035/369722) sembra suggerire così. –