Unit test when a method calls another oneSimple Apex class to return a list of stringsCode Coverage Queryhow to test a future method which makes callouts?Is simple get set should be covered with system.assert?Site.getBaseUrl returns empty string in test methodCannot Return a List of Strings - Void method must not return a valueapex test class for web api callTest class code coverage failsTest Class Only Covers the Callout Method but the rest of the methods isn'tTest Class/Method for TriggerHandler - Negative scenario
Anatomically Correct Carnivorous Tree
Is taking modulus on both sides of an equation valid?
Ex-manager wants to stay in touch, I don't want to
On studying Computer Science vs. Software Engineering to become a proficient coder
On what legal basis did the UK remove the 'European Union' from its passport?
Can I say: "When was your train leaving?" if the train leaves in the future?
Developers demotivated due to working on same project for more than 2 years
How to cope with regret and shame about not fully utilizing opportunities during PhD?
Why are solar panels kept tilted?
LWC1513: @salesforce/resourceUrl modules only support default imports
Find hamming distance between two Strings of equal length in Java
return tuple of uncopyable objects
Is there any good reason to write "it is easy to see"?
Why is it harder to turn a motor/generator with shorted terminals?
What is the largest number of identical satellites launched together?
What should a student do when they are the victim of a FERPA violation?
What episode was being referenced by this part of Discovery's season 2 episode 13 recap?
What kind of SATA connector is this?
How can a layman easily get the consensus view of what academia *thinks* about a subject?
Solubility in different pressure conditions
When a land becomes a creature, is it untapped?
How exactly does artificial gravity work?
German characters on US-International keyboard layout
Was this character’s old age look CGI or make-up?
Unit test when a method calls another one
Simple Apex class to return a list of stringsCode Coverage Queryhow to test a future method which makes callouts?Is simple get set should be covered with system.assert?Site.getBaseUrl returns empty string in test methodCannot Return a List of Strings - Void method must not return a valueapex test class for web api callTest class code coverage failsTest Class Only Covers the Callout Method but the rest of the methods isn'tTest Class/Method for TriggerHandler - Negative scenario
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
I have the current scenario and it's not clear which is the best way to test it.
public class FirstClass
public Integer firstMethod()
return SecondClass.secondClass_Handler();
public class SecondClass
public Integer secondClass_Handler()
//complex logic here to calculate the Integer returned
The method SecondClass.secondClass_Handler
is very complex and I have written all test cases to cover it.
Now the question is: how can I handle the test cases for the method FirstClass.firstMethod()
?
Should I write again all test cases (and duplicate them) or can I skip that becasue the main logic has just tested?
Thanks
apex unit-test code-coverage
add a comment |
I have the current scenario and it's not clear which is the best way to test it.
public class FirstClass
public Integer firstMethod()
return SecondClass.secondClass_Handler();
public class SecondClass
public Integer secondClass_Handler()
//complex logic here to calculate the Integer returned
The method SecondClass.secondClass_Handler
is very complex and I have written all test cases to cover it.
Now the question is: how can I handle the test cases for the method FirstClass.firstMethod()
?
Should I write again all test cases (and duplicate them) or can I skip that becasue the main logic has just tested?
Thanks
apex unit-test code-coverage
add a comment |
I have the current scenario and it's not clear which is the best way to test it.
public class FirstClass
public Integer firstMethod()
return SecondClass.secondClass_Handler();
public class SecondClass
public Integer secondClass_Handler()
//complex logic here to calculate the Integer returned
The method SecondClass.secondClass_Handler
is very complex and I have written all test cases to cover it.
Now the question is: how can I handle the test cases for the method FirstClass.firstMethod()
?
Should I write again all test cases (and duplicate them) or can I skip that becasue the main logic has just tested?
Thanks
apex unit-test code-coverage
I have the current scenario and it's not clear which is the best way to test it.
public class FirstClass
public Integer firstMethod()
return SecondClass.secondClass_Handler();
public class SecondClass
public Integer secondClass_Handler()
//complex logic here to calculate the Integer returned
The method SecondClass.secondClass_Handler
is very complex and I have written all test cases to cover it.
Now the question is: how can I handle the test cases for the method FirstClass.firstMethod()
?
Should I write again all test cases (and duplicate them) or can I skip that becasue the main logic has just tested?
Thanks
apex unit-test code-coverage
apex unit-test code-coverage
edited May 2 at 13:19
fromero
195114
195114
asked May 2 at 13:17
vt89vt89
328212
328212
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
There's a few different ways to approach it, and none of them is definitely the right answer for every single situation.
If firstMethod()
is really just one line of code, I'd cover it with a single integration test validating that its action is correct based on the expected value returned by secondClass_Handler()
for the given input. But I doubt in your real class that it's one line of code. It may be feasible to cover it with multiple integration tests that don't simply replicate the unit tests you already wrote for secondClass_Handler()
.
The fuller-scale solution I would use if I wanted a "true" unit test is to dependency inject SecondClass
in FirstClass
so that you control the return value of secondClass_Handler()
and can test firstMethod()
in isolation. There's more than one way to implement that; the usual route that I use is interface-based. Inside FirstClass
:
private @TestVisible interface ISecondClassDelegate
Integer secondClass_Handler();
private @TestVisible class SecondClassConcreteDelegate implements ISecondClassDelegate
public Integer secondClass_Handler()
return SecondClass.secondClass_Handler();
@TestVisible private secondClassDelegate = new SecondClassConcreteDelegate();
public Integer firstMethod()
return this.mySecondClassHandler.secondClass_Handler();
then, in the unit test,
private class MockSecondClassDelegate implements FirstClass.ISecondClassDelegate
public Integer secondClass_Handler()
return 1; // or what have you.
@isTest
public static void testFirstMethod()
FirstClass f = new FirstClass();
f.secondClassDelegate = new MockSecondClassDelegate();
// test logic for a return value of 1.
That's a fair amount of boilerplate, and whether or not it's appropriate and needed to effectively validate the behavior of firstMethod()
is a decision you'll have to make based on your understanding of the code and its interaction with secondClass_Handler()
.
add a comment |
You can skip them for unit tests, although some organizations prefer to write "functional" unit tests as well (to test end-to-end functionality). This ensures that there's no governor limit issues, etc.
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "459"
;
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: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
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%2fsalesforce.stackexchange.com%2fquestions%2f260885%2funit-test-when-a-method-calls-another-one%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
There's a few different ways to approach it, and none of them is definitely the right answer for every single situation.
If firstMethod()
is really just one line of code, I'd cover it with a single integration test validating that its action is correct based on the expected value returned by secondClass_Handler()
for the given input. But I doubt in your real class that it's one line of code. It may be feasible to cover it with multiple integration tests that don't simply replicate the unit tests you already wrote for secondClass_Handler()
.
The fuller-scale solution I would use if I wanted a "true" unit test is to dependency inject SecondClass
in FirstClass
so that you control the return value of secondClass_Handler()
and can test firstMethod()
in isolation. There's more than one way to implement that; the usual route that I use is interface-based. Inside FirstClass
:
private @TestVisible interface ISecondClassDelegate
Integer secondClass_Handler();
private @TestVisible class SecondClassConcreteDelegate implements ISecondClassDelegate
public Integer secondClass_Handler()
return SecondClass.secondClass_Handler();
@TestVisible private secondClassDelegate = new SecondClassConcreteDelegate();
public Integer firstMethod()
return this.mySecondClassHandler.secondClass_Handler();
then, in the unit test,
private class MockSecondClassDelegate implements FirstClass.ISecondClassDelegate
public Integer secondClass_Handler()
return 1; // or what have you.
@isTest
public static void testFirstMethod()
FirstClass f = new FirstClass();
f.secondClassDelegate = new MockSecondClassDelegate();
// test logic for a return value of 1.
That's a fair amount of boilerplate, and whether or not it's appropriate and needed to effectively validate the behavior of firstMethod()
is a decision you'll have to make based on your understanding of the code and its interaction with secondClass_Handler()
.
add a comment |
There's a few different ways to approach it, and none of them is definitely the right answer for every single situation.
If firstMethod()
is really just one line of code, I'd cover it with a single integration test validating that its action is correct based on the expected value returned by secondClass_Handler()
for the given input. But I doubt in your real class that it's one line of code. It may be feasible to cover it with multiple integration tests that don't simply replicate the unit tests you already wrote for secondClass_Handler()
.
The fuller-scale solution I would use if I wanted a "true" unit test is to dependency inject SecondClass
in FirstClass
so that you control the return value of secondClass_Handler()
and can test firstMethod()
in isolation. There's more than one way to implement that; the usual route that I use is interface-based. Inside FirstClass
:
private @TestVisible interface ISecondClassDelegate
Integer secondClass_Handler();
private @TestVisible class SecondClassConcreteDelegate implements ISecondClassDelegate
public Integer secondClass_Handler()
return SecondClass.secondClass_Handler();
@TestVisible private secondClassDelegate = new SecondClassConcreteDelegate();
public Integer firstMethod()
return this.mySecondClassHandler.secondClass_Handler();
then, in the unit test,
private class MockSecondClassDelegate implements FirstClass.ISecondClassDelegate
public Integer secondClass_Handler()
return 1; // or what have you.
@isTest
public static void testFirstMethod()
FirstClass f = new FirstClass();
f.secondClassDelegate = new MockSecondClassDelegate();
// test logic for a return value of 1.
That's a fair amount of boilerplate, and whether or not it's appropriate and needed to effectively validate the behavior of firstMethod()
is a decision you'll have to make based on your understanding of the code and its interaction with secondClass_Handler()
.
add a comment |
There's a few different ways to approach it, and none of them is definitely the right answer for every single situation.
If firstMethod()
is really just one line of code, I'd cover it with a single integration test validating that its action is correct based on the expected value returned by secondClass_Handler()
for the given input. But I doubt in your real class that it's one line of code. It may be feasible to cover it with multiple integration tests that don't simply replicate the unit tests you already wrote for secondClass_Handler()
.
The fuller-scale solution I would use if I wanted a "true" unit test is to dependency inject SecondClass
in FirstClass
so that you control the return value of secondClass_Handler()
and can test firstMethod()
in isolation. There's more than one way to implement that; the usual route that I use is interface-based. Inside FirstClass
:
private @TestVisible interface ISecondClassDelegate
Integer secondClass_Handler();
private @TestVisible class SecondClassConcreteDelegate implements ISecondClassDelegate
public Integer secondClass_Handler()
return SecondClass.secondClass_Handler();
@TestVisible private secondClassDelegate = new SecondClassConcreteDelegate();
public Integer firstMethod()
return this.mySecondClassHandler.secondClass_Handler();
then, in the unit test,
private class MockSecondClassDelegate implements FirstClass.ISecondClassDelegate
public Integer secondClass_Handler()
return 1; // or what have you.
@isTest
public static void testFirstMethod()
FirstClass f = new FirstClass();
f.secondClassDelegate = new MockSecondClassDelegate();
// test logic for a return value of 1.
That's a fair amount of boilerplate, and whether or not it's appropriate and needed to effectively validate the behavior of firstMethod()
is a decision you'll have to make based on your understanding of the code and its interaction with secondClass_Handler()
.
There's a few different ways to approach it, and none of them is definitely the right answer for every single situation.
If firstMethod()
is really just one line of code, I'd cover it with a single integration test validating that its action is correct based on the expected value returned by secondClass_Handler()
for the given input. But I doubt in your real class that it's one line of code. It may be feasible to cover it with multiple integration tests that don't simply replicate the unit tests you already wrote for secondClass_Handler()
.
The fuller-scale solution I would use if I wanted a "true" unit test is to dependency inject SecondClass
in FirstClass
so that you control the return value of secondClass_Handler()
and can test firstMethod()
in isolation. There's more than one way to implement that; the usual route that I use is interface-based. Inside FirstClass
:
private @TestVisible interface ISecondClassDelegate
Integer secondClass_Handler();
private @TestVisible class SecondClassConcreteDelegate implements ISecondClassDelegate
public Integer secondClass_Handler()
return SecondClass.secondClass_Handler();
@TestVisible private secondClassDelegate = new SecondClassConcreteDelegate();
public Integer firstMethod()
return this.mySecondClassHandler.secondClass_Handler();
then, in the unit test,
private class MockSecondClassDelegate implements FirstClass.ISecondClassDelegate
public Integer secondClass_Handler()
return 1; // or what have you.
@isTest
public static void testFirstMethod()
FirstClass f = new FirstClass();
f.secondClassDelegate = new MockSecondClassDelegate();
// test logic for a return value of 1.
That's a fair amount of boilerplate, and whether or not it's appropriate and needed to effectively validate the behavior of firstMethod()
is a decision you'll have to make based on your understanding of the code and its interaction with secondClass_Handler()
.
answered May 2 at 13:24
David Reed♦David Reed
41.8k82463
41.8k82463
add a comment |
add a comment |
You can skip them for unit tests, although some organizations prefer to write "functional" unit tests as well (to test end-to-end functionality). This ensures that there's no governor limit issues, etc.
add a comment |
You can skip them for unit tests, although some organizations prefer to write "functional" unit tests as well (to test end-to-end functionality). This ensures that there's no governor limit issues, etc.
add a comment |
You can skip them for unit tests, although some organizations prefer to write "functional" unit tests as well (to test end-to-end functionality). This ensures that there's no governor limit issues, etc.
You can skip them for unit tests, although some organizations prefer to write "functional" unit tests as well (to test end-to-end functionality). This ensures that there's no governor limit issues, etc.
answered May 2 at 13:20
sfdcfoxsfdcfox
270k13217467
270k13217467
add a comment |
add a comment |
Thanks for contributing an answer to Salesforce Stack Exchange!
- 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%2fsalesforce.stackexchange.com%2fquestions%2f260885%2funit-test-when-a-method-calls-another-one%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