Let's Play: Test-Driven Development

Let's Play: Test-Driven Development is a screencast series featuring Java, test-driven development, and evolutionary design. It chronicles the development of a real software project, warts and all. Each episode is about 15 minutes long.

The series ran from August 2010 to June 2012.

Episodes:

  1. Chapter 32: State-Based vs. Mock-Based
    1. #201: From Mock-Based to State-Based
    2. #200: To Kill a Mock
    3. #199: Constructor Cleanup
    4. #198: Removing Getters and Setters
    5. #197: It’s Like a Horror Movie
    6. #196: I Don’t Know If This is a Good Idea
    7. #195: A Trojan Horse
    8. #194: It’s Really That Simple
    9. #193: Turning the Application Inside Out
    10. #192: A Tricky Little Refactoring
    11. #191: The Cheat
    12. #190: State-Based vs. Mock-Based Testing
    13. #189: A State-Based Approach
    14. #188: How Saving Works from End to End
  2. Chapter 31: Save Dialog Cleanup
    1. #187: __Invocation
    2. #186: Finishing SaveAsDialog Extraction
    3. #185: Disentangling Our Test
    4. #184: This is Why We Have Tests
    5. #183: Extract Class
    6. #182: Grab Bag
    7. #181: invokeAndWaitFor()
    8. #180: There's That Race Condition Again
  3. Chapter 30: Exception Handler
    1. #179: Eventually You Can't Rely on Your Tests Anymore
    2. #178: I Can't Believe That Worked
    3. #177: The Time is Worthwhile
    4. #176: Combustible Lemons
    5. #175: This is Why Apple is Eating Your Lunch
    6. #174: JOptionPane Spike
    7. #173: Checked Exceptions are Awesome
  4. Chapter 29: Integrating Persistence
    1. #172: Persistence Can Be Tricky
    2. #171: Bogus Data
    3. #170: Back to SaveFile
    4. #169: Defect Prevention
    5. #168: Regression
  5. Chapter 28: Data Preservation
    1. #167: Finished with UserEnteredDollars
    2. #166: Overkill
    3. #165: Eliminating the Double Dispatch Problem
    4. #164: Core Data Type
    5. #163: Combinatorial Explosion
    6. #162: Wishing for Double Dispatch
    7. #161: The UserEnteredDollars Value Object
    8. #160: End of Week 1
    9. #159: How Do We Store Data?
  6. Chapter 27: File I/O
    1. #158: writeFile() and readFile()
    2. #157: Datum
    3. #156: Persistence, for Realsies
    4. #155: Transitioning to SaveFile
  7. Chapter 26: Save Dialog Interaction
    1. #154: Save and Cancel... Done!
    2. #153: Push the Button
    3. #152: No-ckito
    4. #151: Mockito
    5. #150: Mulling Over the Persistence Design
  8. Chapter 25: The “Save As” Dialog
    1. #149: Polishing Off the Save As Dialog
    2. #148: Asynchronous Assertions
    3. #147: Finding the Dialog
    4. #146: Race Condition
    5. #145: Displaying the FileDialog
    6. #144: Cost vs. Benefit
    7. #143: File → Save As...
  9. Chapter 24: File → Close
    1. #142: Good Enough
    2. #141: Domain-Specific Languages
    3. #140: Cleaning Up the Menu Code
    4. #139: File → Close
  10. Chapter 23: File → New
    1. #139: File → Close
    2. #138: New Windows
    3. #137: How Many Frames?
    4. #136: Accelerators
    5. #135: File → New
    6. #134: Persistence!
  11. Chapter 22: Revisiting the Stock Market Table
    1. #133: Towards an Agile Architecture
    2. #132: Fresh Eyes on the Domain
    3. #131: JComponent vs. JPanel
  12. Chapter 21: A Bug!
    1. #131: JComponent vs. JPanel
    2. #130: The Great Negative Color Debacle
    3. #129: Root Cause Analysis
  13. Chapter 20: More Text Fields
    1. #128: 2^7
    2. #127: Yearly Spending Field
    3. #126: Following Patterns
    4. #125: The Cost Basis Field
    5. #124: Constraints
    6. #123: MiGLayout
    7. #122: Extracting ConfigurationPanel
    8. #121: Back to the UI Vision
  14. Chapter 19: Icon in Text Field
    1. #120: DollarsTextField: Done!
    2. #119: Comments Lie
    3. #118: Coupling vs. Complexity
    4. #117: setIcon
    5. #116: You Gotta Know What You're Doing
    6. #115: Wrapping Up the Icon Spike
    7. #114: Icon Challenges
    8. #113: OverlayLayout?
    9. #112: It's in the (Grid)Bag
    10. #111: Icon in JTextField
  15. Chapter 18: Rendering Negative Text Entry
    1. #110: Create a Beautiful, Simple Result
    2. #109: Zombie TDGotchi
    3. #108: Wishing for First-Class Functions
    4. #107: The Hidden Listener
    5. #106: Back from the Dead
    6. #105: Negative TextField
    7. #104: Cleaned Up and Ready to Move On
    8. #103: Test Double
    9. #102: Heresy, Revisited
  16. Intermission: 100th Episode Special
    1. #100: Twenty-Five Hours
  17. Chapter 17: Overflow and Underflow
    1. #101: Factory Method
    2. #99: Valid Range
    3. #98: One Beeellion Dollars
  18. Chapter 16: Custom Renderers
    1. #97: Where the Rubber Meets the Road
    2. #96: Resources
    3. #95: Tested, Rendered, and Isolated
    4. #94: SelfRenderable
    5. #93: Insanity Check
    6. #92: InvalidDollars Gets an Icon
    7. #91: Rendering ValidDollars
    8. #90: Heresy in the Land of Package Dependencies
  19. Chapter 15: Input Validation
    1. #89: The Double of Death
    2. #88: Cascading Failures
    3. #87: InvalidDollars
    4. #86: Pushing Down Methods
    5. #85: ValidDollars
  20. Chapter 14: Focus and Formatting
    1. #85: ValidDollars
    2. #84: Parentheses
    3. #83: Parsing and Formatting
    4. #82: Constructors, Folklore, and the Java Language Spec
    5. #81: Clunk... Clunk... Clunk...
    6. #80: Focus Lost
    7. #79: Focus Gained
  21. Chapter 13: Custom Text Field
    1. #78: Making Numbers Work
    2. #77: Buy Versus Build
    3. #76: Onward... Slowly
    4. #75: Hacking on the Custom TextField
    5. #74: Number Formatting Spike
    6. #73: Cycles
  22. Chapter 12: User Input with Live Updating
    1. #72: Starting to Look Like a Real Application
    2. #71: Poking at Listeners
    3. #70: Reflections on Incremental Design
    4. #69: Train Wreck
    5. #68: It's Sh*t Like This, Java
    6. #67: A Closure Would be Helpful Right About Now
    7. #66: Proving the ApplicationModel Design Concept
    8. #65: Cogitating on ApplicationModel
    9. #64: Integrating ApplicationModel
    10. #63: Simplifying StockMarketProjection
    11. #62: Listening Carefully
    12. #61: Questions of Design
    13. #60: Layout Managers
  23. Chapter 11: The Application Frame
    1. #59: Application... Tested!
    2. #58: Violating Encapsulation
    3. #57: Taking Over the Application Frame
    4. #56: Window Titles
  24. Chapter 10: Beautifying the UI
    1. #55: The Color of Failure (with Kim Gräsman)
    2. #54: Prognosticating (with Kim Gräsman)
    3. #53: Testing Styles (with Kim Gräsman)
    4. #52: Success! (with Roy Osherove)
    5. #51: Alternate Background Color (with Roy Osherove)
    6. #50: Code Monkey (with Roy Osherove)
    7. #49: The AlternatingRowTable (with Roy Osherove)
    8. #48: Transitioning to Production Code (with Roy Osherove)
  25. Chapter 9: UI Testing Research
    1. #47: Spike-a-riffic
    2. #46: Don't Mean a Thing if it Ain't Got that Swing
    3. #45: Looking for Keys in All the Wrong Places
    4. #44: Dis Approvals
    5. #43: Seeking Approvals
  26. Chapter 8: A New Capital Gains Tax Calculation
    1. #42: But What's the Question?
    2. #41: Sell Every Year
    3. #40: Fixed the Capital Gains Abstraction... I Think
    4. #39: Torturing Myself
    5. #38: Torturing Rob (with Rob Myers)
    6. #37: Reviewing the Code (with Rob Myers)
    7. #36: Pair Programming! (with Rob Myers)
    8. #35: Right on Form
    9. #34: Revising the Capital Gains Tax Abstraction
    10. #33: Value Objects Pay Off
  27. Chapter 7: Cumulative Rounding Error
    1. #33: Value Objects Pay Off
    2. #32: Rounding Off Pennies
    3. #31: Eliminating Dollars.toInt
    4. #30: Introducing Dollars.percentage
    5. #29: More Failing
  28. Chapter 6: Back to the Domain Model
    1. #29: More Failing
    2. #28: Integrating Year and Failing Fast
    3. #27: Yet Another Value Object
    4. #26: Integrating StockMarket into StockMarketTableModel
    5. #25: Extracting the StockMarket Class
  29. Chapter 5: A Basic User Interface
    1. #24: Finishing Up StockMarketTableModel
    2. #23: Multiple Years
    3. #22: Hooking Up the Domain Model
    4. #21: Column Headers
    5. #20: Getting Started on the UI
    6. #19: UI Training
  30. Chapter 4: Primitive Obsession
    1. #18: StockMarketYear—Done!
    2. #17: Integrating Dollars
    3. #16: The Dollars Class
    4. #15: Integrating TaxRate and InterestRate
    5. #14: Obsessing Over Primitives
    6. #13: The TaxRate Class
  31. Chapter 3: Cleanup
    1. #13: The TaxRate Class
    2. #12: Polishing to a High Gloss
    3. #11: Consolidating the Tests
    4. #10: Ending Capital Gains
    5. #9: Seeking Beauty
    6. #8: Cleaning Up Taxes
  32. Chapter 2: Domain Logic
    1. #7: Tax Rage
    2. #6: Capital Gains Tax—Almost
    3. #5: Domain Logic
    4. #4: Gaining on Capital Gains
  33. Chapter 1: Testing Basics
    1. #4: Gaining on Capital Gains
    2. #3: Cleaning Up My Mess
    3. #2: Peering Dimly Into the Future
    4. #1: How Does this Thing Work, Again?