2013-04-05 22 views
12

Hẹn giờ đầu tiên ở đây, xin lỗi nếu tôi đã bỏ lỡ bất cứ điều gì. Tôi hy vọng có được một cuộc gọi đến một phương pháp tĩnh bằng cách sử dụng Spock. Phản hồi sẽ tuyệt vờiGiả lập phương pháp tĩnh với GroovyMock hoặc tương tự trong Spock

Với mock groovy, tôi nghĩ tôi có thể vượt qua cuộc gọi tĩnh nhưng chưa tìm thấy. Đối với nền, tôi đang trong quá trình trang bị lại các thử nghiệm trong java cũ. Tái cấu trúc bị cấm. Tôi đang sử dụng spock-0.7 với groovy-1.8.

Các cuộc gọi đến phương thức tĩnh được xích với một cuộc gọi dụ trong hình thức này:

public class ClassUnderTest{ 

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

} 

staticMethod trả về một thể hiện của ClassWithStatic instanceMethod trả về Thing cần thiết trong phần còn lại của phương pháp

Nếu Tôi trực tiếp thực hiện mô hình toàn cầu, nó trả về trường hợp giả mạo 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 
    } 
} 

Nhưng nếu tôi chạy metho dUnderTest từ 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 
    } 
} 

Nó ném xuống một trường hợp thực sự của ClassWithStatic không hoạt động trong instanceMethod của nó.

+1

Nếu giúp ai đó, tôi đang sử dụng GroovyMock in Spock để thay đổi các phương thức tĩnh trong mã Java, nhưng điều này ảnh hưởng sai đến các thử nghiệm khác. Tôi đã sử dụng chú thích này để khắc phục sự cố @ConfineMetaClassChanges – Topera

Trả lời

15

Spock chỉ có thể giả lập các phương thức tĩnh được triển khai trong Groovy. Đối với các phương thức tĩnh mô phỏng được thực hiện bằng Java, bạn sẽ cần phải sử dụng một công cụ như GroovyMock, PowerMock hoặc JMockit.

PS: Với những công cụ này, chúng tôi muốn biết liệu chúng có hoạt động tốt như thế nào với các thử nghiệm được thực hiện trong Groovy/Spock (chứ không phải Java/JUnit) .

+0

Cảm ơn Peter. Sẽ tiếp tục tích hợp và cho bạn biết – alexgibbs

+0

Bạn có nhận được câu trả lời không? Tôi thấy một ví dụ ở đây: https://github.com/kriegaex/Spock_PowerMock – JavaJigs

2

Dưới đây là cách tôi giải quyết vấn đề tương tự tôi (chế giễu một lời gọi phương thức tĩnh mà đã được gọi từ một lớp tĩnh) với Spock (v1.0) và 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" 

    } 
} 

Các @PowerMockIgnore Chú thích là tùy chọn, chỉ sử dụng nó nếu có một số xung đột với các thư viện hiện có