2015-12-06 25 views
6

Có thể giả lập các lớp học cuối cùng giả lập không? Nếu vậy, làm thế nào? Kết quả tìm kiếm đã đưa ra điều này gist, điều này có vẻ hàm ý như vậy, nhưng tôi không thể tìm thấy bất kỳ ví dụ nào về việc làm như vậy. Tôi cũng đã tìm thấy các bài đăng trên diễn đàn cho biết các lớp cuối cùng chế nhạo không được hỗ trợ.Lớp cuối cùng của mô hình trong Spock

+0

Đôi khi, với Groovy, tốt nhất bạn nên dùng thử. – cjstehno

+0

@cjstehno Tôi đã thử và có ngoại lệ. Nhưng tôi nghĩ có thể có một cách làm đặc biệt mà tôi không biết. –

+0

Câu trả lời của tôi có giải quyết được vấn đề không? – Opal

Trả lời

14

đặc điểm kỹ thuật này:

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

kết thúc với ngoại lệ sau đây:

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. 

Các giải pháp là sử dụng 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   
    } 
} 

nào hoạt động tốt.

+0

Bất kỳ ý tưởng tại sao điều này không làm việc cho String.length()? –

+0

Sự khác biệt với String.length() là vì nó được định nghĩa trên lớp Java String, không phải phiên bản Groovy? Câu trả lời này (http://stackoverflow.com/a/12177035/369722) dường như gợi ý như vậy. –

Các vấn đề liên quan