Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spock stub matching partial arguments

Tags:

mocking

spock

I am using spock for my test cases and I am stubbing a class as below, inventryDAO has a method getUser which accepts a argument of type PersistableKey.

In the main code the argument is created as below

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

In my Specification if I write the stub and argument as below, it works fine

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

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

inventoryDAO.getUser(userKey) >> collUser

But what I really want to do is to be able to pass argument without setting the setRepresentedObjectClass, something like this

User collUser = new User(1);
InventoryDAO inventoryDAO = Stub()
    
PersistableKey userKey = new PersistableKey(1)
    
inventoryDAO.getUser(userKey) >> collUser

Is it possible to match the argument based on partial values ?

like image 598
Ambuj Jauhari Avatar asked Nov 04 '25 16:11

Ambuj Jauhari


1 Answers

Spock supports several kind of Argument Constraints, when you use an object you are using the Equality Constraint which uses groovy equality to compare the constraint argument with the argument from an invocation. If you can't or don't want to change the equals method of PersistableKey, then you can manually compare the fields that are relevant to you using a Code Argument Constraint.

inventoryDAO.getUser({ userKey.id == 1 }) >> collUser

You can also combine a Code Argument Constraint with a Type Constraint

inventoryDAO.getUser({ userKey.id == 1 } as PersistableKey) >> collUser
like image 135
Leonard Brünings Avatar answered Nov 07 '25 15:11

Leonard Brünings