📖 Scenario: You are building a simple app that fetches user data from a server. To test your code without calling the real server, you will use test doubles called mocks and stubs.
🎯 Goal: Learn how to create and use test doubles (mocks and stubs) in Swift to test code that depends on external services.
📋 What You'll Learn
Create a protocol for user data fetching
Create a stub class that returns fixed user data
Create a mock class that records method calls
Write a test function that uses the stub and mock to verify behavior
💡 Why This Matters
🌍 Real World
Test doubles help developers test code that depends on external systems without needing the real systems available.
💼 Career
Understanding mocks and stubs is essential for writing reliable automated tests in software development jobs.
Progress0 / 4 steps
1
Create a protocol for user data fetching
Create a protocol called UserDataFetcher with a function fetchUser(id: Int) -> String that returns a String.
Swift
Hint
A protocol defines a blueprint of methods. Use protocol UserDataFetcher and declare the function inside.
2
Create a stub class that returns fixed user data
Create a class called UserDataStub that conforms to UserDataFetcher. Implement fetchUser(id: Int) to always return the string "Stub User".
Swift
Hint
Make a class that says it follows the protocol. Then write the function to return the fixed string.
3
Create a mock class that records method calls
Create a class called UserDataMock that conforms to UserDataFetcher. Add a variable calledWithId of type Int? to record the id passed. Implement fetchUser(id: Int) to save the id to calledWithId and return "Mock User".
Swift
Hint
Make a class that saves the id it receives and returns a fixed string.
4
Write a test function that uses the stub and mock
Write a function called testUserDataFetchers(). Inside, create an instance of UserDataStub and call fetchUser(id: 1). Then create an instance of UserDataMock, call fetchUser(id: 42), and print calledWithId from the mock.
Swift
Hint
Call the stub and mock, then print the mock's recorded id.
Practice
(1/5)
1. What is the main purpose of using a mock in Swift testing?
easy
A. To record how a function was called during a test
B. To provide fixed data without recording calls
C. To replace the entire app with a test version
D. To speed up the app in production
Solution
Step 1: Understand what a mock does
A mock is a test double that records how it was used, such as which methods were called and with what arguments.
Step 2: Compare with other test doubles
Unlike stubs, mocks focus on interaction verification, not just providing fixed answers.
Final Answer:
To record how a function was called during a test -> Option A
Quick Check:
Mock = Records calls [OK]
Hint: Mocks remember calls; stubs just return data [OK]
Common Mistakes:
Confusing mocks with stubs
Thinking mocks speed up production
Believing mocks replace the whole app
2. Which of the following is the correct way to define a stub method in Swift that always returns 42?
easy
A. func getNumber() -> Int { return 42 }
B. func getNumber() -> Int { print(42) }
C. func getNumber() { return 42 }
D. func getNumber() -> String { return "42" }
Solution
Step 1: Check method signature and return type
The method must return an Int, so the signature should be func getNumber() -> Int.
Step 2: Verify the return statement
The method should return the integer 42, so return 42 is correct.
Final Answer:
func getNumber() -> Int { return 42 } -> Option A
Quick Check:
Stub returns fixed value [OK]
Hint: Stub methods return fixed values with correct return type [OK]
Common Mistakes:
Missing return type in function signature
Returning wrong data type
Using print instead of return
3. Consider this Swift mock class snippet:
class ServiceMock {
var fetchCalled = false
func fetchData() {
fetchCalled = true
}
}
let mock = ServiceMock()
mock.fetchData()
print(mock.fetchCalled)
What will be printed?
medium
A. false
B. true
C. nil
D. Compilation error
Solution
Step 1: Understand the mock class behavior
The class has a boolean property fetchCalled initially false. The method fetchData() sets it to true.
Step 2: Trace the code execution
After creating mock, calling mock.fetchData() sets fetchCalled to true. Printing it outputs true.
Final Answer:
true -> Option B
Quick Check:
Mock records call = true [OK]
Hint: Mock flags change after method call [OK]
Common Mistakes:
Assuming fetchCalled stays false
Expecting nil instead of Bool
Thinking code won't compile
4. This Swift stub class is intended to return a fixed string but has a bug:
D. Missing return statement; add return "Fixed data"
Solution
Step 1: Identify the method signature and body
The method declares it returns a String but only calls print without returning anything.
Step 2: Fix the missing return
Replace print("Fixed data") with return "Fixed data" to satisfy the return type.
Final Answer:
Missing return statement; add return "Fixed data" -> Option D
Quick Check:
Stub must return value, not print [OK]
Hint: Return values, don't print in stubs [OK]
Common Mistakes:
Confusing print with return
Changing method name unnecessarily
Changing return type incorrectly
5. You want to test a Swift class Downloader that calls a network service. To avoid real network calls, you create a mock service that records if download() was called and a stub that returns fixed data. Which approach correctly combines mocks and stubs for this test?
hard
A. Use only a mock that returns fixed data without recording calls
B. Use only a stub that records calls and returns data
C. Use a mock to record download() calls and a stub to return fixed data when fetchData() is called
D. Use real network service to ensure accurate testing
Solution
Step 1: Understand roles of mocks and stubs
Mocks record interactions like method calls; stubs provide fixed return data.
Step 2: Apply correct combination
Use a mock to check if download() was called, and a stub to supply fixed data for fetchData() to avoid real network calls.
Final Answer:
Use a mock to record download() calls and a stub to return fixed data when fetchData() is called -> Option C
Quick Check:
Mock records calls + Stub returns data [OK]
Hint: Mocks track calls; stubs provide data [OK]
Common Mistakes:
Using only one test double type
Relying on real network in tests
Confusing mock and stub roles
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.