gpt4 book ai didi

mocking - 在 BDD 和 TDD 中利用模拟 (Spock + Mockito)

转载 作者:行者123 更新时间:2023-12-02 08:40:54 24 4
gpt4 key购买 nike

我正在使用 Spock 和 Mockito,但我很难弄清楚如何从 Mocks 中获取值(value)。

我正在尝试为名为 UserResource 的 REST 接口(interface)构建 RESTful 服务,该接口(interface)与 EJB3 服务层进行通信。

EJB3 服务将需要由其他开发人员编写的新方法。因此,我想我会创建一个 Mock 来代替 REST 接口(interface)。

这是我的 Spock 测试:

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,willReturn y。

但是,如果我要设置行为,我实际上是在为特定的 Spock 特征方法编码它们的行为方式,一旦实现,它可能与真实事物相同,也可能不同。

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

我认为我在概念上对如何利用 Mocks 正确测试正在开发的系统有点纠结。

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

最佳答案

根据您描述的第一部分,我认为您在 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。您的测试应该与此类似。请注意,我没有在测试中直接调用模拟。我通过调用被测系统 (RestApi.doLogic()) 间接调用它。

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

关于mocking - 在 BDD 和 TDD 中利用模拟 (Spock + Mockito),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16655978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com