基于斯波克的测试中模拟对象的存根



我正在使用Spock fw和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 的键。我假设键没有空值,但它有空值。

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

我找到了解决方案之一。

在上面的例子中,我尝试像mockedService.findOne(_) >> host一样使用 Spock HostService#findOne(Long id)方法存根。也许它似乎不适合莫基托的模拟对象。

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

试试这个:

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

相关内容

  • 没有找到相关文章