2016-04-25 115 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的。它运作良好!