我和Mockito一起使用Spock fw。我有一个名为' 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
的密钥。我假设密钥没有空值,但它具有空值。
为什么我的想法不起作用?
答案 0 :(得分:4)
我找到了一个解决方案。
在上面的例子中,我尝试使用像HostService#findOne(Long id)
这样的Spock来存储mockedService.findOne(_) >> host
方法。也许似乎不适合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。它运作良好!
答案 1 :(得分:0)
试试这个:
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
}
}