在 Spock 框架中模拟
Mocking in Spock framework
我尝试用 Spock 编写测试,但遇到了一些问题。
代码会告诉更多......我的测试看起来像:
class MyServiceSpec extends Specification {
private MyService myService
private MyDAO myDAO
def setup() {
myDAO = Mock(MyDAO)
myService = new MyServiceImpl(myDAO)
}
def "Should get something"() {
given:
def user = Mock(User)
def date = now()
myDAO.getUsersSomethingFromDate(_ as User, _ as LocalDate) >> [ Mock(Something) ]
when:
myService.getUsersSomethingFromDate(user, date)
then:
1 * myDAO.getUsersSomethingFromDate(_ as User, _ as LocalDate)
}
}
MyDAO
是一个 interface
。
我也尝试了不同的 setup
方法:
def setup() {
myDAO = Mock(MyDAO) {
getUsersSomethingFromDate(_ as User, _ as LocalDate) >> [ Mock(Something) ]
}
myService = new MyServiceImpl(myDAO)
}
尽管我声明方法 getUsersSomethingFromDate
应该 return [ Mock(Something) ]
,但它 return 应该 null
。在下一个服务方法 运行 中,我收到了 NullPointerException
,因为 returned 'null' 而不是模拟实例列表。
问题是为什么声明值为 return 的模拟对象仍然 returns null
?
mock 与调用计数检查相结合时出现问题,因为 mock 不会被调用。
您可以用这种方式重写组合测试以使其正常工作:
def "Should get something"() {
given:
def user = Mock(User)
def date = now()
when:
myService.getUsersSomethingFromDate(user, date)
then:
1 * myDAO.getUsersSomethingFromDate(_ as User, _ as LocalDate) >> [ Mock(Something) ]
}
见http://spockframework.org/spock/docs/1.3/all_in_one.html#_combining_mocking_and_stubbing
我尝试用 Spock 编写测试,但遇到了一些问题。 代码会告诉更多......我的测试看起来像:
class MyServiceSpec extends Specification {
private MyService myService
private MyDAO myDAO
def setup() {
myDAO = Mock(MyDAO)
myService = new MyServiceImpl(myDAO)
}
def "Should get something"() {
given:
def user = Mock(User)
def date = now()
myDAO.getUsersSomethingFromDate(_ as User, _ as LocalDate) >> [ Mock(Something) ]
when:
myService.getUsersSomethingFromDate(user, date)
then:
1 * myDAO.getUsersSomethingFromDate(_ as User, _ as LocalDate)
}
}
MyDAO
是一个 interface
。
我也尝试了不同的 setup
方法:
def setup() {
myDAO = Mock(MyDAO) {
getUsersSomethingFromDate(_ as User, _ as LocalDate) >> [ Mock(Something) ]
}
myService = new MyServiceImpl(myDAO)
}
尽管我声明方法 getUsersSomethingFromDate
应该 return [ Mock(Something) ]
,但它 return 应该 null
。在下一个服务方法 运行 中,我收到了 NullPointerException
,因为 returned 'null' 而不是模拟实例列表。
问题是为什么声明值为 return 的模拟对象仍然 returns null
?
mock 与调用计数检查相结合时出现问题,因为 mock 不会被调用。
您可以用这种方式重写组合测试以使其正常工作:
def "Should get something"() {
given:
def user = Mock(User)
def date = now()
when:
myService.getUsersSomethingFromDate(user, date)
then:
1 * myDAO.getUsersSomethingFromDate(_ as User, _ as LocalDate) >> [ Mock(Something) ]
}
见http://spockframework.org/spock/docs/1.3/all_in_one.html#_combining_mocking_and_stubbing