我正在使用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的行为,而不是测试真实的东西。
我想我在概念上有点挣扎,如何利用模拟来测试开发中的系统。
如有任何建议或见解,我将不胜感激。提前感谢!根据你的描述的第一部分,我认为你嘲笑的是错误的东西。让我重新解释一下你说的话,这样你就能明白我是如何理解你的问题的:
- 你正在编写一个REST api。
- 其他人正在用ejb为它编写业务逻辑
- 你想写一些测试来测试你写的东西
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()
)间接地调用它。
这与你的例子不同。您真正要测试的是正确地设置了模拟。总而言之,您应该模拟出被测系统的依赖关系,而不是被测系统。