在基于 spock 的测试中对 mockito 模拟对象进行存根

Dev*_*ken 3 mockito spock

我正在使用 Spock fw 和 Mockito。我有一个名为“HostController”的控制器和一个名为“HostService”的服务。

'HostController' 的方法称为 as host(Long id),'HostService' 的方法称为 as 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
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的测试中,controller.host(1)返回Map<String, Object>类型并且它的键名为host. 我假设键没有空值,但它有空值。

为什么不像我想的那样工作?

Dev*_*ken 5

我找到了解决方案之一。

在上面的示例中,我尝试HostService#findOne(Long id)使用 Spock 之类的存根方法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
    }
}
Run Code Online (Sandbox Code Playgroud)

我们可以使用 Mockito 存根,而不是 Spock 的存根。它运作良好!