TestingMidMCQ

What is a mock vs a stub vs a spy?

Test your knowledge:

Explanation & Code

Answer: All three are test doubles — fake objects used in place of real dependencies — but with different roles.

  • Stub — returns hardcoded values, no behaviour verification
  • Mock — verifies that specific methods were called
  • Spy — wraps real implementation, records calls for later verification

Code Example:

protocol AnalyticsService {
    func track(_ event: String)
}

// Stub — just returns values, doesn't verify calls
class StubAnalytics: AnalyticsService {
    func track(_ event: String) { }  // does nothing
}

// Mock — verifies interactions
class MockAnalytics: AnalyticsService {
    var trackedEvents: [String] = []
    func track(_ event: String) {
        trackedEvents.append(event)
    }
}

// In test
func test_login_tracksEvent() {
    let analytics = MockAnalytics()
    let viewModel = LoginViewModel(analytics: analytics)
    viewModel.login(username: "alice", password: "pass")
    XCTAssertEqual(analytics.trackedEvents, ["login_success"])
}

Rate your understanding:

Ready to practice more Testing?

Test yourself with our interactive quiz mode or browse all curated questions for this topic.