Table of Contents
Contents
foreword xv
preface xvii
acknowledgments xix
about this book xxii
about the cover illustration xxx
Part 1 The building blocks 1
- 1 Fundamentals 3
- 1.1 What is Programmer Testing? 4
- 1.2 Getting started with JUnit 10
- 1.3 A few good practices 17
- 1.4 Summary 20
- 2 Elementary tests 22
- 2.1 Test your equals method 26
- 2.2 Test a method that returns nothing 33
- 2.3 Test a constructor 37
- 2.4 Test a getter 41
- 2.5 Test a setter 44
- 2.6 Test an interface 48
- 2.7 Test a JavaBean 54
- 2.8 Test throwing the right exception 56
- 2.9 Let collections compare themselves 61
- 2.10 Test a big object for equality 63
- 2.11 Test an object that instantiates other objects 66
- 3 Organizing and building JUnit tests 71
- 3.1 Place test classes in the same package as production code 74
- 3.2 Create a separate source tree for test code 77
- 3.3 Separate test packages from production code packages 79
- 3.4 Factor out a test fixture 83
- 3.5 Factor out a test fixture hierarchy 87
- 3.6 Introduce a Base Test Case 90
- 3.7 Move special case tests to a separate test fixture 92
- 3.8 Build tests from the command line 94
- 3.9 Build tests using Ant 96
- 3.10 Build tests using Eclipse 99
- 4 Managing test suites 102
- 4.1 Let JUnit build your test suite 103
- 4.2 Collect a specific set of tests 107
- 4.3 Collect all the tests in a package 111
- 4.4 Collect all the tests for your entire system 114
- 4.5 Scan the file system for tests 116
- 4.6 Separate the different kinds of test suites 120
- 4.7 Control the order of some of your tests 123
- 4.8 Build a data-driven test suite 127
- 4.9 Define a test suite in XML 133
- 5 Working with test data 136
- 5.1 Use Java system properties 138
- 5.2 Use environment variables 142
- 5.3 Use an inline data file 145
- 5.4 Use a properties file 147
- 5.5 Use ResourceBundles 152
- 5.6 Use a file-based test data repository 154
- 5.7 Use XML to describe test data 156
- 5.8 Use Ant?s <sql> task to work with a database 157
- 5.9 Use JUnitPP 159
- 5.10 Set up your fixture once for the entire suite 161
- 5.11 Perform environment setup once for multiple test runs 164
- 5.12 Use DbUnit 170
- 6 Running JUnit tests 173
- 6.1 See the name of each test as it executes 177
- 6.2 See the name of each test as it executes with a text-based test runner 178
- 6.3 Execute a single test 180
- 6.4 Execute each test in its own JVM 181
- 6.5 Reload classes before each test 182
- 6.6 Ignore a test 185
- 7 Reporting JUnit results 188
- 7.1 Using a Base Test Case with a logger 190
- 7.2 Using Log4Unit 194
- 7.3 Getting plain text results with Ant 198
- 7.4 Reporting results in HTML with Ant?s <junitreport> task 202
- 7.5 Customizing <junit> XML reports with XSLT 205
- 7.6 Extending Ant?s JUnit results format 208
- 7.7 Implementing TestListener and extending TestRunner 215
- 7.8 Reporting a count of assertions 224
- 8 Troubleshooting JUnit 233
- 8.1 JUnit cannot find your tests 235
- 8.2 JUnit does not execute your custom test suite 237
- 8.3 JUnit does not set up your test fixture 239
- 8.4 Test setup fails after overriding runTest() 241
- 8.5 Your test stops after the first assertion fails 244
- 8.6 The graphical test runner does not load your classes properly 250
- 8.7 JUnit fails when your test case uses JAXP 252
- 8.8 JUnit fails when narrowing an EJB reference 253
Part 2 Testing J2EE 257
- Introduction
- Designing J2EE applications for testability 259
- The Coffee Shop application 263
- 9 Testing and XML 265
- 9.1 Verify the order of elements in a document 273
- 9.2 Ignore the order of elements in an XML document 277
- 9.3 Ignore certain differences in XML documents 281
- 9.4 Get a more detailed failure message from XMLUnit 288
- 9.5 Test the content of a static web page 290
- 9.6 Test an XSL stylesheet in isolation 297
- 9.7 Validate XML documents in your tests 302
- 10 Testing and JDBC 308
- 10.1 Test making domain objects from a ResultSet 317
- 10.2 Verify your SQL commands 322
- 10.3 Test your database schema 327
- 10.4 Verify your tests clean up JDBC resources 335
- 10.5 Verify your production code cleans up JDBC resources 343
- 10.6 Manage external data in your test fixture 346
- 10.7 Manage test data in a shared database 349
- 10.8 Test permissions when deploying schema objects 352
- 10.9 Test legacy JDBC code without the database 357
- 10.10 Test legacy JDBC code with the database 360
- 10.11 Use schema-qualified tables with DbUnit 363
- 10.12 Test stored procedures 366
- 11 Testing Enterprise JavaBeans 370
- 11.1 Test a session bean method outside the container 378
- 11.2 Test a legacy session bean 387
- 11.3 Test a session bean method in a real container 394
- 11.4 Test a CMP entity bean 397
- 11.5 Test CMP meta data outside the container 400
- 11.6 Test a BMP entity bean 408
- 11.7 Test a message-driven bean inside the container 414
- 11.8 Test a message-driven bean outside the container 420
- 11.9 Test a legacy message-driven bean 422
- 11.10 Test a JMS message consumer without the messaging server 426
- 11.11 Test JMS message-processing logic 430
- 11.12 Test a JMS message producer 433
- 11.13 Test the content of your JNDI directory 439
- 12 Testing web components 443
- 12.1 Test updating session data without a container 446
- 12.2 Test updating the HTTP session object 452
- 12.3 Test rendering a JavaServer Page 456
- 12.4 Test rendering a Velocity template 465
- 12.5 Test a JSP tag handler 468
- 12.6 Test your JSP tag library deployment 474
- 12.7 Test servlet initialization 477
- 12.8 Test the ServletContext 480
- 12.9 Test processing a request 483
- 12.10 Verify web page content without a web server 491
- 12.11 Verify web form attributes 494
- 12.12 Verify the data passed to a page template 495
- 12.13 Test a web resource filter 500
- 13 Testing J2EE applications 508
- 13.1 Test page flow 510
- 13.2 Test navigation rules in a Struts application 519
- 13.3 Test your site for broken links 522
- 13.4 Test web resource security 525
- 13.5 Test EJB resource security 530
- 13.6 Test container-managed transactions 536
Part 3 More JUnit techniques 541
- 14 Testing design patterns 543
- 14.1 Test an Observer (Event Listener) 545
- 14.2 Test an Observable (Event Source) 550
- 14.3 Test a Singleton 556
- 14.4 Test a Singleton?s client 559
- 14.5 Test an object factory 562
- 14.6 Test a template method?s implementation 566
- 15 GSBase 572
- 15.1 Verify events with EventCatcher 574
- 15.2 Test serialization 577
- 15.3 Test object cloning 579
- 15.4 Compare JavaBeans using ?appears equal? 581
- 16 JUnit-addons 585
- 16.1 Test your class for compareTo() 587
- 16.2 Collect tests automatically from an archive 590
- 16.3 Organize test data using PropertyManager 591
- 16.4 Manage shared test resources 593
- 16.5 Ensure your shared test fixture tears itself down 597
- 16.6 Report the name of each test as it executes 599
- 17 Odds and ends 603
- 17.1 Clean up the file system between tests 605
- 17.2 Test your file-based application without the file system 608
- 17.3 Verify your test case class syntax 614
- 17.4 Extract a custom assertion 617
- 17.5 Test a legacy method with no return value 620
- 17.6 Test a private method if you must 625
- Appendix A Complete solutions 629
- A.1 Define a test suite in XML 630
- A.2 Parameterized Test Case overriding runTest() 634
- A.3 Ignore the order of elements in an XML document 637
- A.4 Test an XSL stylesheet in isolation 639
- A.5 Validate XML documents in your tests 645
- A.6 Aspect-based universal Spy 649
- A.7 Test a BMP entity bean 653
- Appendix B Essays on testing 673
- B.1 Too simple to break 674
- B.2 Strangeness and transitivity 677
- B.3 Isolate expensive tests 681
- B.4 The mock objects landscape 689
- Appendix C Reading List 696
 
references 700
index 705