2016-04-25 116 views
1

我正在使用Spock fw和Mockito。我有一個名爲'HostController'的控制器和一個名爲'HostService'的服務。基於spock的測試中mockito模擬對象的殘差

'HostController'具有名爲host(Long id)的方法,'HostService'具有名爲findOne(Long id)的方法。

我想測試HostController#host(Long id),所以我想到了剔除findOne(Long id)的方法。

遵循的是測試代碼:

class MockTest extends Specification { 
    @Mock 
    private HostService mockedService; 

    @InjectMocks 
    private HostController controller; 

    def setup() { 
     MockitoAnnotations.initMocks(this); 
    } 

    def "mock test"() { 
     given: 
     def host = new Host(id: 1, ipAddress: "127.0.0.1", hostName: "host1") 
     mockedService.findOne(_) >> host 

     when: 
     Map<String, Object> result = controller.host(1) 

     then: 
     result.get("host") != null 
    } 
} 

在上面的測試,controller.host(1)返回Map<String, Object>類型,它有一個名爲host的關鍵。我假設這個鍵沒有空值,但它有空值。

爲什麼不按我的想法工作?

回答

0

試試這個:

import spock.lang.Specification 

class MySpec extends Specification { 
    HostController controller 

    def setup() { 
     controller = new HostController() 
    } 

    def "mock test"() { 
     given: 
     HostService mockedService = Mock(HostService) 
     def host = new Host(id: 1, ipAddress: "127.0.0.1", hostName: "host1") 
     mockedService.findOne(_) >> host 
     controller.service = mockedService 

     when: 
     Map<String, Object> result = controller.host(1) 

     then: 
     result.get("host") != null 
    } 
} 
+0

它工作得很好。但我想用Mockito代替Spock Mock。 – Devcken

+0

抱歉,抱歉我的堅持,但是,爲什麼? –

2

我找到的解決方案之一。

在上面的例子中,我嘗試使用Spock的HostService#findOne(Long id)存根方法,如mockedService.findOne(_) >> host。也許它似乎不適合Mockito的模仿對象。

Rene Enriquez向我介紹Spock Mock。它工作得很好。不過,我想使用@InjectMocks和@Mock。爲了做到這一點,我們按照嘲諷的Mockito和磕碰指令(謝謝你,恩裏克斯)

修改的例子是:

import static org.mockito.Mockito.when; 

class MockTest extends Specification { 
    @Mock 
    private HostService mockedService; 

    @InjectMocks 
    private HostController controller; 

    def setup() { 
     MockitoAnnotations.initMocks(this); 
    } 

    def "mock test"() { 
     given: 
     def host = new Host(id: 1, ipAddress: "127.0.0.1", hostName: "host1") 
     when(mockedService.findOne(1)).thenReturn(host) 

     when: 
     Map<String, Object> result = controller.host(1) 

     then: 
     result.get("host") != null 
    } 
} 

我們可以使用的Mockito磕碰,不Spock的。它運作良好!