2015-12-06 3 views
6

Может ли выпустить финальные классы? Если да, то как? Результаты поиска подняли этот gist, что, казалось бы, подразумевает это, но я не могу найти примеров этого. Я также нашел сообщения на форуме, которые говорят, что насмешливые финальные классы не поддерживаются.Mock final class in Spock

+0

Иногда с Groovy лучше всего просто попробовать. – cjstehno

+0

@cjstehno Я попробовал и получил исключение. Но я подумал, может быть, есть особый способ сделать это, о котором я не знаю. –

+0

Отвечает ли мой ответ на проблему? – Opal

ответ

14

Эта спецификация:

@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   
    } 
} 

заканчивается следующим исключением:

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. 

Решение использовать 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   
    } 
} 

, который работает хорошо.

+0

Любая идея, почему это не работает для String.length()? –

+0

Может ли разница с String.length() быть, потому что она определена в классе Java String, а не в версии Groovy? Этот [ответ] (http://stackoverflow.com/a/12177035/369722), кажется, так предлагает. –

Смежные вопросы