Spock 存根匹配部分参数

Amb*_*ari 3 mocking spock

我在测试用例中使用 spock,并按如下方式存根一个类,inventryDAO 有一个 getUser 方法,它接受 PersistableKey 类型的参数。

在主代码中,参数创建如下

PersistableKey userKey = new PersistableKey(1)
userKey.setRepresentedObjectClass(User.class);
Run Code Online (Sandbox Code Playgroud)

在我的规范中,如果我按如下方式编写存根和参数,则效果很好

User collUser = new User(1);
InventoryDAO inventoryDAO = Stub()

PersistableKey userKey = new PersistableKey(1)
userKey.setRepresentedObjectClass(User.class);

inventoryDAO.getUser(userKey) >> collUser
Run Code Online (Sandbox Code Playgroud)

但我真正想做的是能够在不设置 setRepresentedObjectClass 的情况下传递参数,如下所示

User collUser = new User(1);
InventoryDAO inventoryDAO = Stub()
    
PersistableKey userKey = new PersistableKey(1)
    
inventoryDAO.getUser(userKey) >> collUser
Run Code Online (Sandbox Code Playgroud)

是否可以根据部分值匹配参数?

Leo*_*ngs 8

Spock 支持多种类型的Argument Constraints,当您使用对象时,您正在使用Equality Constraint,它使用 groovy equals 来将约束参数与调用中的参数进行比较。如果您不能或不想更改equals的方法,那么您可以使用代码参数约束PersistableKey手动比较与您相关的字段 。

inventoryDAO.getUser({ userKey.id == 1 }) >> collUser
Run Code Online (Sandbox Code Playgroud)

您还可以将代码参数约束类型约束结合起来

inventoryDAO.getUser({ userKey.id == 1 } as PersistableKey) >> collUser
Run Code Online (Sandbox Code Playgroud)