你如何模拟你在spock中测试的类中的方法

时间:2014-09-09 22:57:24

标签: grails groovy spock

我想在我的网站上测试一种方法

public boolean syncUser(username, password){
    if (getUserFromDB(username)){
            // do work
            return true
    }
    return false
}

如何测试syncUser和存根/模拟getUserFromDB

我已尝试过所有内容,包括

_ * _.getUserFromDB(*_) >> true

但它不断尝试使用该方法而不是使用返回值。测试用例如下:

void "successfulSyncUser"(){
    given:
    _ * _.getUserFromDB(*_) >> true

    when:
    def syncUserResult = userManagement.syncUser(username, password)

    then:
    syncGuidResult == true
}

1 个答案:

答案 0 :(得分:1)

您只能在模拟中使用此语句。

 _ * _.getUserFromDB(*_) >> true

这意味着您必须先使用

def mock = Mock(YourClass)

在您的情况下,getUserFromDBsyncUser属于同一个班级。在这种情况下,你不能使用模拟。

这是希望你能做到的。您可以使用Groovys Metaclass覆盖当前UserManagement实例的实现。

void "successfulSyncUser"(){
    given:
    userManagement.metaClass.getUserFromDB = { param1 -> return true }

    when:
    def syncUserResult = userManagement.syncUser(username, password)

    then:
    syncGuidResult == true
}

请查看如何使用Groovy Magic覆盖现有方法的简单示例:)

class Person {    
    String sayHello() { 'Foo' }
}

def a = new Person()
def b = new Person()

println a.sayHello()
println b.sayHello()

a.metaClass.sayHello = { 'Bar' }

println a.sayHello()
println b.sayHello()

这将产生以下输出:

Foo
Foo
Bar
Foo