A test double is a simplified object that stands in for a real object during testing to isolate the code being tested.
Click to reveal answer
beginner
Name the four common types of test doubles.
The four common types are: Dummy, Stub, Mock, and Spy.
Click to reveal answer
beginner
When should you use a Dummy test double?
Use a Dummy when you need to pass an object but it is not used by the test, just to satisfy method parameters.
Click to reveal answer
intermediate
What is the main purpose of a Stub?
A Stub provides predefined responses to calls made during the test, controlling indirect inputs to the system under test.
Click to reveal answer
intermediate
How does a Mock differ from a Stub?
A Mock not only provides predefined responses but also verifies that certain interactions happened, like method calls with specific arguments.
Click to reveal answer
Which test double is used only to fill parameter lists but is never actually used in the test?
ADummy
BStub
CMock
DSpy
✗ Incorrect
A Dummy is a placeholder object passed to satisfy method signatures but not used in the test.
Which test double helps control indirect inputs by returning fixed data during tests?
AMock
BStub
CDummy
DSpy
✗ Incorrect
A Stub returns predefined data to control the behavior of the system under test.
Which test double verifies that specific methods were called with expected arguments?
ADummy
BStub
CMock
DSpy
✗ Incorrect
Mocks verify interactions, such as method calls and arguments, during the test.
If you want to record how a real object was used during a test, which test double would you use?
ADummy
BStub
CMock
DSpy
✗ Incorrect
A Spy records information about how it was called, allowing verification after the test.
Which test double should you choose if you only want to isolate the tested code without verifying interactions?
AStub
BDummy
CSpy
DMock
✗ Incorrect
Stubs isolate the tested code by providing controlled responses without verifying calls.
Explain the differences between Dummy, Stub, Mock, and Spy test doubles and when to use each.
Think about their roles in controlling inputs and verifying behavior.
You got /4 concepts.
Describe a real-life example where choosing the right test double improves test reliability.
Consider how test doubles help avoid dependencies and make tests faster.
You got /3 concepts.
Practice
(1/5)
1. Which test double should you use in JUnit when you want to replace a real object and verify that certain methods were called during the test?
easy
A. Mock
B. Stub
C. Fake
D. Spy
Solution
Step 1: Understand the purpose of mocks
Mocks are used to fake behavior and verify interactions, such as method calls.
Step 2: Compare with other test doubles
Stubs provide fixed responses, fakes have working implementations, spies record calls but mocks are designed for verification.
Final Answer:
Mock -> Option A
Quick Check:
Verify calls = Mock [OK]
Hint: Mocks verify calls; stubs just return data [OK]
Common Mistakes:
Confusing stubs with mocks
Using fake when verification is needed
Thinking spies are the same as mocks
2. Which of the following is the correct way to create a stub in JUnit using Mockito?
easy
A. spy(new Service());
B. when(service.getData()).thenReturn("data");
C. mock(Service.class);
D. verify(service).getData();
Solution
Step 1: Identify stub creation syntax
Stubs return fixed data; in Mockito, use when(...).thenReturn(...) to stub a method.
Step 2: Check other options
Verify checks calls, mock creates mocks, spy wraps real objects; only when().thenReturn() stubs.
Final Answer:
when(service.getData()).thenReturn("data"); -> Option B
Quick Check:
Stub method = when().thenReturn() [OK]
Hint: Stubs use when().thenReturn() syntax [OK]
Common Mistakes:
Using verify() to stub methods
Confusing mock() with stub setup
Using spy() instead of stub
3. Given the following JUnit test code snippet using Mockito, what will be the output of the assertion?
List<String> list = mock(List.class);
when(list.size()).thenReturn(5);
assertEquals(5, list.size());
medium
A. Test passes because size() returns 5
B. Test fails because size() returns 0 by default
C. Test throws NullPointerException
D. Test fails due to syntax error
Solution
Step 1: Analyze mock behavior
The list is mocked, and size() is stubbed to return 5.
Step 2: Check assertion
assertEquals(5, list.size()) compares 5 with stubbed return 5, so it passes.
Final Answer:
Test passes because size() returns 5 -> Option A
Quick Check:
Stubbed method returns set value [OK]
Hint: Stubbed methods return set values, so assertion passes [OK]
Common Mistakes:
Assuming default mock returns 0
Expecting real method call on mock
Confusing mock with spy behavior
4. Identify the error in this JUnit test using Mockito:
@Test
void testServiceCall() {
Service service = mock(Service.class);
service.process();
verify(service.process());
}
medium
A. Mock creation syntax is wrong
B. Missing stub for process() method
C. process() method cannot be mocked
D. Incorrect use of verify; should be verify(service).process();
Solution
Step 1: Check verify syntax
verify() expects the mock object, then method call separately: verify(service).process();
Step 2: Identify error in code
Current code calls verify(service.process()), which is incorrect syntax and causes compile error.
Final Answer:
Incorrect use of verify; should be verify(service).process(); -> Option D
Quick Check:
verify syntax = verify(mock).method() [OK]
Hint: verify() needs mock object, then method call separately [OK]
Common Mistakes:
Calling verify with method call inside
Forgetting to mock the object
Confusing stub and verify usage
5. You want to test a payment processing system. The payment gateway is an external service that charges real money. Which test double should you use in your JUnit tests to avoid real charges but still verify that the payment method was called correctly?
hard
A. Use a stub to return a fixed success response
B. Use a fake with a simple in-memory implementation
C. Use a mock to verify the payment method call
D. Use a spy to wrap the real payment gateway
Solution
Step 1: Understand test goal
We want to avoid real charges but verify the payment method was called.
Step 2: Choose test double type
Mocks fake behavior and verify calls, perfect for checking method calls without real effects.
Step 3: Compare other options
Stubs return fixed data but don't verify calls; fakes have real logic; spies call real methods, risking real charges.
Final Answer:
Use a mock to verify the payment method call -> Option C
Quick Check:
Verify calls without real effect = Mock [OK]
Hint: Mocks verify calls without real side effects [OK]
Common Mistakes:
Using spy risks real external calls
Using stub misses call verification
Choosing fake adds unnecessary complexity
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.