在BDD和TDD中利用mock (Spock + Mockito)



我正在使用Spock和Mockito,我很难弄清楚如何从Mocks中获得价值。

我正在尝试为一个称为UserResource的REST接口构建RESTful服务,该接口与EJB3服务层通信。

EJB3服务将需要由另一个开发人员编写的新方法。因此,我认为应该创建一个Mock来代替REST接口。

Here is my Spock Test:

package commonapi.test
import commonapi.command.request.UserCreateRequest
import commonapi.command.resource.UserResource
import commonapi.response.CommandResponse
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import spock.lang.Specification
import static org.mockito.BDDMockito.given
import static org.mockito.Mockito.*
/**
 * Specification for Create User Command.
 */
class CreateUserTest extends Specification
{
    /**
     * Mocked Resource.
     */
    @Mock
    UserResource mockedUserResource;
    def setup()
    {
        MockitoAnnotations.initMocks(this)
    }
    def "Mocked Resource Create Single User"()
    {
        given:
            UserCreateRequest createRequest = new UserCreateRequest()
            given(mockedUserResource.createUser(createRequest)).willReturn(new CommandResponse())
        when:
            CommandResponse commandResponse = mockedUserResource.createUser(createRequest)
        then:
            commandResponse != null
    }
}

它编译,并且测试运行(通过)

问题是,我觉得我并没有真正"测试"任何东西。据我所知,Mockito Mocks只是"空对象",你可以在其中"设置行为",即给定x,将返回y。

然而,如果我在设置行为,我本质上是在为特定Spock Feature Method的目的编写它们应该如何行为的代码,一旦它被实现,它可能与真实的东西相同,也可能不相同。

基本上,我正在为测试的目的构建Mock的行为,而不是测试真实的东西。

我想我在概念上有点挣扎,如何利用模拟来测试开发中的系统。

如有任何建议或见解,我将不胜感激。提前感谢!

根据你的描述的第一部分,我认为你嘲笑的是错误的东西。让我重新解释一下你说的话,这样你就能明白我是如何理解你的问题的:

  1. 你正在编写一个REST api。
  2. 其他人正在用ejb为它编写业务逻辑
  3. 你想写一些测试来测试你写的东西
在这种情况下,您应该模拟出EJB代码,而不是REST代码。下面是纯java/Mockito的示例:
package com.sandbox;
import org.junit.Test;
import static org.mockito.Mockito.*;
public class SandboxTest {
    @Test
    public void myTest() {
        Ejb mock = mock(Ejb.class);
        RestApi restApi = new RestApi();
        restApi.setEjb(mock);
        restApi.doLogic();
        verify(mock).logic();
    }
    private static class Ejb {
        public void logic() {
        }
    }
    private static class RestApi {
        private Ejb ejb;
        private void setEjb(Ejb ejb) {
            this.ejb = ejb;
        }
        public void doLogic() {
            ejb.logic();
        }
    }            
}

这里测试的系统是RestApi.doLogic。您的测试应该与此类似。注意,我没有在测试中直接调用mock。我通过调用被测系统(RestApi.doLogic())间接地调用它。

这与你的例子不同。您真正要测试的是正确地设置了模拟。总而言之,您应该模拟出被测系统的依赖关系,而不是被测系统。

相关内容

  • 没有找到相关文章

最新更新