Stub a void method in a Spy object with Spock
I'm using Spock and my class to test is wrapped in a Spy.
I want to isolate the method being tested, so I'm trying to stub out other methods that are called from the method being tested.
Normally I would use something like this:
1 * classToTest.methodName(_) >> stubbed_return_value
My problem is this: methodName
is a void method.
I tried this:
1 * classToTest.methodName(_)
but the actual method is still called.
How do I stub out a void method using Spock?
java groovy spock
add a comment |
I'm using Spock and my class to test is wrapped in a Spy.
I want to isolate the method being tested, so I'm trying to stub out other methods that are called from the method being tested.
Normally I would use something like this:
1 * classToTest.methodName(_) >> stubbed_return_value
My problem is this: methodName
is a void method.
I tried this:
1 * classToTest.methodName(_)
but the actual method is still called.
How do I stub out a void method using Spock?
java groovy spock
Just in case anyone who is as clueless as myself gets here at some time: in Spock you can't mock private methods: they will just run as normal with a Spy. I found this "limitation" of Spock (it's actually because it does not make testing sense) surprising, in the sense that you can call such methods from your Spy (and seem to mock them) in your testing code... It might possibly be nice if Spock could disallow this or flag it as an error...
– mike rodent
Feb 13 '18 at 19:43
add a comment |
I'm using Spock and my class to test is wrapped in a Spy.
I want to isolate the method being tested, so I'm trying to stub out other methods that are called from the method being tested.
Normally I would use something like this:
1 * classToTest.methodName(_) >> stubbed_return_value
My problem is this: methodName
is a void method.
I tried this:
1 * classToTest.methodName(_)
but the actual method is still called.
How do I stub out a void method using Spock?
java groovy spock
I'm using Spock and my class to test is wrapped in a Spy.
I want to isolate the method being tested, so I'm trying to stub out other methods that are called from the method being tested.
Normally I would use something like this:
1 * classToTest.methodName(_) >> stubbed_return_value
My problem is this: methodName
is a void method.
I tried this:
1 * classToTest.methodName(_)
but the actual method is still called.
How do I stub out a void method using Spock?
java groovy spock
java groovy spock
asked Feb 28 '17 at 15:25
DwBDwB
29.1k84473
29.1k84473
Just in case anyone who is as clueless as myself gets here at some time: in Spock you can't mock private methods: they will just run as normal with a Spy. I found this "limitation" of Spock (it's actually because it does not make testing sense) surprising, in the sense that you can call such methods from your Spy (and seem to mock them) in your testing code... It might possibly be nice if Spock could disallow this or flag it as an error...
– mike rodent
Feb 13 '18 at 19:43
add a comment |
Just in case anyone who is as clueless as myself gets here at some time: in Spock you can't mock private methods: they will just run as normal with a Spy. I found this "limitation" of Spock (it's actually because it does not make testing sense) surprising, in the sense that you can call such methods from your Spy (and seem to mock them) in your testing code... It might possibly be nice if Spock could disallow this or flag it as an error...
– mike rodent
Feb 13 '18 at 19:43
Just in case anyone who is as clueless as myself gets here at some time: in Spock you can't mock private methods: they will just run as normal with a Spy. I found this "limitation" of Spock (it's actually because it does not make testing sense) surprising, in the sense that you can call such methods from your Spy (and seem to mock them) in your testing code... It might possibly be nice if Spock could disallow this or flag it as an error...
– mike rodent
Feb 13 '18 at 19:43
Just in case anyone who is as clueless as myself gets here at some time: in Spock you can't mock private methods: they will just run as normal with a Spy. I found this "limitation" of Spock (it's actually because it does not make testing sense) surprising, in the sense that you can call such methods from your Spy (and seem to mock them) in your testing code... It might possibly be nice if Spock could disallow this or flag it as an error...
– mike rodent
Feb 13 '18 at 19:43
add a comment |
2 Answers
2
active
oldest
votes
You can just stub it with null
...
Given the following Java class:
public class Complex
private final List<String> sideEffects = new ArrayList<>();
protected void sideEffect(String name)
sideEffects.add("Side effect for " + name);
public int call(String name)
sideEffect(name);
return name.length();
public List<String> getSideEffects()
return sideEffects;
We want to hide the sideEffect
method, so nothing is done by it, so we can use the following spec:
class ComplexSpec extends Specification
def 'we can ignore void methods in Spies'()
given:
Complex complex = Spy()
when:
int result = complex.call('tim')
then:
result == 3
1 * complex.sideEffect(_) >> null
complex.sideEffects ==
add a comment |
You could also return an empty closure (instead of a null):
1 * complex.sideEffect(_) >>
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f42512657%2fstub-a-void-method-in-a-spy-object-with-spock%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can just stub it with null
...
Given the following Java class:
public class Complex
private final List<String> sideEffects = new ArrayList<>();
protected void sideEffect(String name)
sideEffects.add("Side effect for " + name);
public int call(String name)
sideEffect(name);
return name.length();
public List<String> getSideEffects()
return sideEffects;
We want to hide the sideEffect
method, so nothing is done by it, so we can use the following spec:
class ComplexSpec extends Specification
def 'we can ignore void methods in Spies'()
given:
Complex complex = Spy()
when:
int result = complex.call('tim')
then:
result == 3
1 * complex.sideEffect(_) >> null
complex.sideEffects ==
add a comment |
You can just stub it with null
...
Given the following Java class:
public class Complex
private final List<String> sideEffects = new ArrayList<>();
protected void sideEffect(String name)
sideEffects.add("Side effect for " + name);
public int call(String name)
sideEffect(name);
return name.length();
public List<String> getSideEffects()
return sideEffects;
We want to hide the sideEffect
method, so nothing is done by it, so we can use the following spec:
class ComplexSpec extends Specification
def 'we can ignore void methods in Spies'()
given:
Complex complex = Spy()
when:
int result = complex.call('tim')
then:
result == 3
1 * complex.sideEffect(_) >> null
complex.sideEffects ==
add a comment |
You can just stub it with null
...
Given the following Java class:
public class Complex
private final List<String> sideEffects = new ArrayList<>();
protected void sideEffect(String name)
sideEffects.add("Side effect for " + name);
public int call(String name)
sideEffect(name);
return name.length();
public List<String> getSideEffects()
return sideEffects;
We want to hide the sideEffect
method, so nothing is done by it, so we can use the following spec:
class ComplexSpec extends Specification
def 'we can ignore void methods in Spies'()
given:
Complex complex = Spy()
when:
int result = complex.call('tim')
then:
result == 3
1 * complex.sideEffect(_) >> null
complex.sideEffects ==
You can just stub it with null
...
Given the following Java class:
public class Complex
private final List<String> sideEffects = new ArrayList<>();
protected void sideEffect(String name)
sideEffects.add("Side effect for " + name);
public int call(String name)
sideEffect(name);
return name.length();
public List<String> getSideEffects()
return sideEffects;
We want to hide the sideEffect
method, so nothing is done by it, so we can use the following spec:
class ComplexSpec extends Specification
def 'we can ignore void methods in Spies'()
given:
Complex complex = Spy()
when:
int result = complex.call('tim')
then:
result == 3
1 * complex.sideEffect(_) >> null
complex.sideEffects ==
answered Feb 28 '17 at 16:31
tim_yatestim_yates
133k21263277
133k21263277
add a comment |
add a comment |
You could also return an empty closure (instead of a null):
1 * complex.sideEffect(_) >>
add a comment |
You could also return an empty closure (instead of a null):
1 * complex.sideEffect(_) >>
add a comment |
You could also return an empty closure (instead of a null):
1 * complex.sideEffect(_) >>
You could also return an empty closure (instead of a null):
1 * complex.sideEffect(_) >>
answered Nov 15 '18 at 14:22
vadimvadim
619923
619923
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f42512657%2fstub-a-void-method-in-a-spy-object-with-spock%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Just in case anyone who is as clueless as myself gets here at some time: in Spock you can't mock private methods: they will just run as normal with a Spy. I found this "limitation" of Spock (it's actually because it does not make testing sense) surprising, in the sense that you can call such methods from your Spy (and seem to mock them) in your testing code... It might possibly be nice if Spock could disallow this or flag it as an error...
– mike rodent
Feb 13 '18 at 19:43