在基于Spock的测试中对Mockito Mock对象进行桩设定

4
我正在使用Spock框架和Mockito。我有一个名为“HostController”的控制器和一个名为“HostService”的服务。
'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的键。我假设该键没有空值,但实际上它是空的。
为什么不像我想的那样工作呢?
2个回答

6

我找到了一个解决方案。

在上面的示例中,我尝试使用Spock来存根HostService#findOne(Long id)方法,例如mockedService.findOne(_) >> host。也许它似乎不适合Mockito的模拟对象。

Rene Enriquez向我介绍了Spock Mock。它非常有效。但是,我想使用@InjectMocks和@Mock。为此,我们遵循Mockito的模拟和存根指令。(谢谢Enriquez)

修改后的示例如下:

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的。它效果很好!

为了帮助您使用 Spock Mocks,Spock 还提供了注释来设置 Subject Collaborator 扩展的 Mocks:https://github.com/marcingrzejszczak/spock-subjects-collaborators-extension - Jeff Sheets

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

它运行得很好。但我想使用Mockito而不是Spock Mock。 - Devcken
抱歉我这么坚持,但是,为什么? - Rene Enriquez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接