【问题标题】:Stubbing of mockito mock object on spock-based test在基于 spock 的测试中对 mockito 模拟对象进行存根
【发布时间】:2016-08-18 15:26:00
【问题描述】:

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

“HostController”的方法称为host(Long id),“HostService”的方法称为findOne(Long id)

我想测试HostController#host(Long id),所以我想到stubing 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&lt;String, Object&gt; 类型并且它有一个名为host 的键。我假设键没有空值,但它有空值。

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

【问题讨论】:

    标签: mockito spock


    【解决方案1】:

    我找到了一种解决方案。

    在上面的示例中,我尝试使用像 mockedService.findOne(_) &gt;&gt; host 这样的 Spock 来存根 HostService#findOne(Long id) 方法。也许它似乎不适合 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 的。效果很好!

    【讨论】:

    【解决方案2】:

    试试这个:

    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。
    • 糟糕,很抱歉我的坚持,但是,为什么?
    猜你喜欢
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多