a()
, jMock, 340
AbstractTableModel
class, 152
for changed requirements, 40
for completed features, 40
for degenerate cases, 41
for new features, 6, 39–40, 105, 225
readability of, 42
ActionListener
interface, 185, 187
ActiveDirectory, 232
addSniper()
, 180
addUserRequestListenerFor()
, 187
mocking, 58
@AfterClass
annotation, 223
Agile Development, 35, 47, 81, 83, 205, 329
aliasing, 50
allOf()
, Hamcrest, 340
allowing()
, jMock, 145–146, 181, 211, 243, 278, 278, 339
an()
, jMock, 340
announce()
, jMock, 187
announceClosed()
, 106–107, 176
aNonNull()
, jMock, 340
ant build tool, 95
aNull()
, jMock, 340
any()
, Hamcrest, 340
anyOf()
, Hamcrest, 340
Apache Commons IO library, 221
application model, 48
ApplicationRunner
class, 85, 89–92, 106–107, 140, 153, 168, 175–177, 183, 207, 254
ArrayIndexOutOfBoundsException
, 217
assertColumnEquals()
, 157
assertEquals()
, JUnit, 21–22, 276
assertEventually()
, 321–323, 326
extending, 343–345
messages for, 268
naming, 86
quantity of, 252
vs. synchronizations, 326
vs. test setup, 211
assertIsSatisfied()
, JUnit, 271
assertNull()
, JUnit, 21–22
assertRowMatchesSnapshot()
, 180
assertThat()
, JUnit, 24–25, 253–255, 268, 276
assertTrue()
, JUnit, 21–22, 24, 255
testing, 315–327
atLeast()
, jMock, 127, 278, 339
atMost()
, jMock, 339
AtomicBigCounter
class, 311–312
AtomicInteger
class, 309–310
attachModelListener()
, Swing, 156–157
Auction
interface, 62, 126–131, 136, 155, 193, 203
Auction Sniper, 75–226
bidding, 79, 84, 105–121, 126–131, 162
for multiple items, 175
connecting, 108, 111, 179, 183
disconnecting, 219–220
displaying state of, 97–98, 128, 144–146, 152–155, 159–160, 171, 323
failing, 215–217
joining auctions, 79, 84, 91, 94, 98–100, 179–181, 184–186, 197–199
losing, 79, 84, 91, 100–102, 125, 130, 164, 205–206
portfolio of, 199
refactoring, 191–203
table model for, 149–152, 156–160, 166
translating messages from auction, 112–118, 139–142, 217
updating current price, 118–121
user interface of, 79, 84, 96–97, 149–173, 183–188, 207–208, 212, 316
walking skeleton for, 79, 83–88
when an auction is closed, 84, 94
auctionClosed()
, 25, 58, 116–117, 119–120, 123–125
AuctionEvent
class, 134–136
AuctionEventListener
interface, 19, 26, 61, 113, 117, 120, 123–124, 141, 192–193, 217–220
auctionFailed()
, 217–220
AuctionHouse
interface, 196, 210
AuctionLogDriver
class, 221, 224
AuctionMessageTranslator
class, 25–27, 61, 112–118, 134–136, 154, 192, 195, 217–219, 222, 224, 226
AuctionMessageTranslatorTest
class, 141
AuctionSearchStressTests
class, 307–309
AuctionSniper
class, 62, 123–134, 154–155, 172–173, 192, 198–199, 208, 210–212
AuctionSniperDriver
class, 91, 153, 168, 184, 207, 254
AuctionSniperEndToEndTest
class, 85, 152, 183
AuctionSniperTest
class, 218
@Before
annotation, 23
between()
, jMock, 339
bidsHigherAndReportsBiddingWhenNewPriceArrives()
, 127, 143
“Big Design Up Front,” 35
BlockingQueue
class, 93
breaking out technique, 59–61, 136
budding off technique, 59, 61–62, 209
build
features included in, 8
from the start of a project, 31
build()
, 258–261
builders. See test data builders, 254
bundling up technique, 59–60, 62, 154
C# programming language, 225
cannotTranslateMessage()
, 222–223
Chat
class, 112, 115, 129–130, 185, 192, 219
encapsulating, 193–195
chatDisconnectorFor()
, 220, 226
ChatManagerListener
interface, 92
check()
, WindowLicker, 187
classes, 14
coherent, 12
context-independent, 55
encapsulating collections into, 136
helper, 93
internal features of, 237
loosely coupled, 11–12
naming, 63, 159–160, 238, 285, 297
tightly coupled, 12
Clock
interface, 230–232
code
adapting, 172
assumptions about, 42
cleaning up, 60, 118, 125, 131, 137, 245, 262–264
compiling, 136
declarative layer of, 65
external quality of, 10–11
implementation layer of, 65
internal quality of, 10–11, 60
loosely coupled, 11–12
readability of, 51, 162, 173, 226, 247
reimplementing, 60
tightly coupled, 12
cohesion, 11–12
collections
encapsulating, 136
vs. domain types, 213
commit()
, 279
communication patterns, 14, 58
communication protocols, 58, 63
ComponentDriver, 90
“composite simpler than the sum of its parts,” 53–54, 60, 62
concurrency, 301–306, 309, 313–316
connect()
, Smack, 100
connection()
, 100
Connextra, 330–332
constants, 255
constructors
bloated, 238–242
real behavior in, 195
container-managed transactions, 293
containsTotalSalesFor()
, 264
context independence, 54–57, 233, 305
CountDownLatch
class, 194
coupling, 11–12
createChat()
, Smack, 129
Crystal Clear, 1
currentPrice()
, 118–120, 123, 141, 162–163
currentTimeMillis()
, java.lang.System
, 230
customer tests. See acceptance tests
DAO (Data Access Object), 297
database tests. See persistence tests
DatabaseCleaner
class, 291–292
databases
cleaning up before testing, 290–292
operations with active transactions in, 300
data-driven tests, 24
date manipulation, 230–233
“debug hell,” 267
Defect
exception, 165
breaking in unit tests, 233
explicit, 14
hidden, 273
knowing about, 231
mocking, 58
on user interface components, 113
scoping, 62
using compiler for navigating, 225
dependency injections, 330
automated, 35–37
from the start of a project, 31
importance for testing, 32
describeMismatch()
, Hamcrest, 343–345
describeTo()
, Hamcrest, 343–345
design
changing, 172
clarifying, 235
feedback on, 6
quality of, 273
DeterministicExecutor
class, 303–304
development
from inputs to outputs, 43, 61
incremental, 4, 36, 73, 79, 136, 201, 303
iterative, 4
of user interface, 183
working compromises during, 90, 95
disconnect()
, Smack, 111
disconnectWhenUICloses()
, 111, 179
domain model, 15, 48, 59, 71, 290
domain-specific language, embedded in Java, 332
“Don’t Repeat Yourself” principle, 248
duplication, 262–264, 273, 275
Dynamock library, 332
Eclipse development environment, 119
end-to-end tests, 8–10
asynchronous, 87
brittleness of, 87
early, 32–33
failing, 87
for event-based systems, 87
on synchronization, 313
running, 11
simulating input and output events, 43
EntityManager
class, 279, 297, 299
EntityManagerFactory
class, 279
EntityTransaction
class, 279
equal()
, jMock, 340
equals()
, java.lang.Object
, 154
equalTo()
, Hamcrest, 322
error messages. See failure messages
event-based systems, 86–87
events, 78
listening for, 316–317, 323–325
processed in sequence, 325–326
exactly()
, jMock, 338
exceptions, 22
catching, 253–254
on hidden threads, 302
runtime, 165
with helpful messages, 330
“Expect Unexpected Changes” principle, 45
Expectation
jMock class, 64
ExpectationCounter
jMock class, 330
expectations, 18, 27, 64–66, 146, 254–255, 277–279, 338
checking after test’s body, 271
clear descriptions of, 25
specifying actions to perform, 341
Expectations
jMock class, 66, 337, 340
ExpectationSet
jMock class, 330
ExpectationValue
jMock class, 330
expectFailureWithMessage()
, 222
expectSniperToFailWhenItIs()
, 219, 253
failed()
, 219
failure messages, 268–269, 276
clearness of, 42
failures, 41
detecting, 217–218
diagnostics for, 267–273, 297, 302–307, 332
displaying, 218–219
handling, 215–226
messages about, 255
writing down while developing, 41
FakeAuctionServer
class, 86, 89, 92–95, 107–110, 120, 176, 194, 254, 276
FeatureMatcher
Hamcrest class, 162, 178
from automated deployment, 35–36
incremental, 300
on failure cases, 41
on implementations, 6
rapid, 317
Findbugs, 313
fixtures, 23
functional tests. See acceptance tests
garbage collection, 23, 91, 101, 192–194
getBody()
, Smack, 222
getColumnCount()
, Swing, 158
getValueAt()
, Swing, 158
Hamcrest library, 21, 24–25, 95, 268, 274, 296, 322, 333, 340, 343–345
hasColumnTitles()
, 169
hasEnoughColumns()
, 156–157
hashCode()
, java.lang.Object
, 154
hasProperty()
, Hamcrest, 178
hasReceivedBid()
, 106–107
hasReceivedJoinRequestFrom()
, 109, 176
hasReceivedJoinRequestFromSniper()
, 106–108
hasShownSniperHasWon()
, 323
hasShownSniperIsBidding()
, 106, 110
hasShownSniperIsLosing()
, 206–207
hasShownSniperIsWinning()
, 140, 176, 323
hasTitle()
, 169
helper methods, 7, 51, 66, 162, 166, 210, 226, 253, 263, 280
HTTP (HyperText Transfer Protocol), 81
IDEs
filling in missing methods on request, 119
navigation in, 114
IETF (Internet Engineering Task Force), 77
ignoring()
, jMock, 145, 278–279, 339
ignoringAuction()
, 219
IllegalArgumentException
, 22
implementations
feedback on, 6
independent of context, 244
for technical tasks to be addressed, 41
for to-do lists, 80–81, 103, 120–121, 130–131, 148, 171, 182, 201, 211–212, 225
initializers, 23
instanses, 237–238
integration tests, 9–10, 186–188
and threads, 71
difficult to code, 44
for adapters, 70
for persistence implementations, 300
passing, 40
speed of, 300
interface discovery, 19
callback, 71
implementing, 63–64
mocking, 235
narrowness of, 63
refactoring, 63–64
relationships with, 63
segregating, 236
invocations
constrained, 342
counting, 338–339
number of, 27
invokeAndWait()
, Swing, 100, 180
invokeLater()
, Swing, 100
isForSameItemAs()
, 181
isSatisfied()
, WindowLicker, 320–321
Jabber. See XMPP
Java programming language, 21
arrays in, 177
collections in, 179
logging framework in, 223
method overloading in, 261
package loops in, 191
synchronization errors in, 313
syntax noise of, 253
using compiler to navigate dependencies, 225
Java EE (Java Platform, Enterprise Edition), 293–294, 301
Java Servlet API, 330
JAXB (Java API for XML Binding), 289
JButton
Swing component, 185
JDBC (Java Database Connectivity), 294
JDO (Java Data Objects), 289
JFormattedTextField
Swing component, 208
JFrame
Swing component, 96
JFrameDriver
WindowLicker class, 91
JLabel
Swing component, 150
jMock library, 24–27, 274, 332
allowances in, 146
double braces in, 337
expectations in, 25, 64–66, 146
extensions to, 162
generating messages in, 345
states in, 145
using for stress tests, 307
verifying mock objects in, 24
version 2, 21, 25–27, 333, 335–342
JMS (Java Messaging Service), 292
JMSTransactor
class, 292
joinAuction()
, 100, 131–132, 142, 180–182, 187–188, 192, 208
JPA (Java Persistence API), 279, 289, 294
persistence identifiers in, 295
JTA (Java Transaction API), 292
JTable
Swing component, 52, 149–157, 170
JTATransactor
class, 292–293
JTextField
Swing component, 185
JUnit library, 84, 274, 332–333
generating messages in, 345
new instances for each test in, 22, 117
version 4.5, 24
JUnit4Mockery
jMock class, 336
Law of Demeter. See “Tell, Don’t Ask” principle
Lisp programming language, 66
literals. See values
cleaning up before testing, 221
generating, 223
logging, 233–235
amount of, 235
diagnostic, 233–235
isolated in a separate class, 226
LoggingXMPPFailureReporter
class, 223–224
Main
class, 91, 101, 108, 117–118, 123, 126, 132–134, 142, 168, 178–180, 183, 185, 188–203
matchmaker role of, 191
MainWindow
class, 96, 100, 113, 134, 151, 156, 166–167, 185–187, 199, 208–209
MainWindowTest
class, 186, 209
makeControls()
, 184–185
Mars Climate Orbiter disaster, 59
Matcher
interface, 25, 268, 343–345
matchers, 24–25, 95, 155, 157, 276, 322, 339–340
combining, 24
custom, 25, 178, 296, 340, 343–345
reversing, 24
stateless, 344
Matchers
Hamcrest class, 340
matches()
, Hamcrest, 343
meetings, 4
MessageHandler
class, 217
MessageListener
interface, 93–94, 99, 112–115, 129, 219
creating and checking in the same construct, 109
parsing, 118–120 See also failure messages
methods, 13
calling, 65
order of, 128
expected, 339–340
getter, 329–330
grouping together, 176
ignoring, 279
overloading, 261
side effects of, 51
“sugar,” 65–66
testing, 43 See also helper methods
MissingValueException
, 218
creating, 336
for third-party code, 69–71, 157, 300
history of, 329–333
invocation order of, 279–282
naming, 336
to visualize protocols, 58, 61
Mockery
jMock class, 26, 64, 66, 307, 336
mocking
adjustments, 58
dependencies, 58
interfaces, 235
notifications, 58
peers, 58
returned types, 279
third-party code, 237
values, 237–238
Moon program, 41
multithreading. See threads
“Never Pass Null between Objects” principle, 274
never()
, jMock, 339
NMock library, 332
notifications, 52–53, 126, 192
capturing, 318–320
mocking, 58
order of, 280
recording, 324
notifiesAuctionClosedWhenCloseMessageReceived()
, 114
notifiesAuctionFailedWhenBadMessageReceived()
, 217
notifiesAuctionFailedWhenEventTypeMissing()
, 218
notifiesBidDetailsWhenCurrentPriceMessageReceivedFromOtherBidder()
, 141
notifiesBidDetailsWhenCurrentPriceMessageReceivedFromSniper()
, 141
notToBeGCd
field, 101, 179, 197, 200, 203
object mother pattern, 257–258
object-oriented programming, 13, 329
objects
abstraction level of, 57
bringing out relationships between, 236
collaborating, 18–20, 52–53, 58, 60–62, 186
communicating, 13–14, 50, 58, 244–245
composite, 53–54
context-independent, 54–55, 233
created by builders, 259–260
difficult to decouple, 273
mutable, 14
sharing references to, 50
observable invariants with respect to concurrency of, 306
passive, 311–312
persistent, 298–299
simplifying, 55
single responsibility of, 51–52
states of, 13, 59, 145–146, 281–283, 299, 306, 342
subordinate, 254, 291–292, 311
tracer, 270–271
validity of, 53
ORM (Object/Relational Mapping), 289, 297, 299
packages
loops of, 191
single responsibility of, 52
pair programming, 4
patterns, naming after, 297
peers, 50
mocking, 58
types of, 52–53
persistence tests, 289–300
and transactions, 292–294
cleaning up at the start, 291
failure diagnostics in, 297
isolating from one another, 290–292
round-trip, 297–300
slowness of, 300
Poller
class, 320–321
polling for changes, 317, 320–321, 323–325
PortfolioListener
interface, 199
ports, 48
“ports and adapters” architecture, 48, 201, 284, 297
PriceSource
enumeration, 141, 148
Probe
interface, 320–322
probing a system, 315, 320–322
processMessage()
, Smack, 114–115, 135–136, 217, 219
production environment, 95
programming styles, 51
PropertyMatcher
Hamcrest class, 178
queries, 278
receivesAMessageMatching()
, 108
redesign, 7
refactoring, 5–7
code difficult to test, 44–45
importance of, during TDD, 225–226
incremental, 202
writing down while developing, 41
reference types, 269
regression tests, 5
planning, 81
to a production system, 35
removeMessageListener()
, Smack, 220
reportsInvalidMessage()
, 216, 221
reportsLostIfAuctionClosesImmediately()
, 145
reportsLostIfAuctionClosesWhenBidding()
, 146
repository pattern, 297
resetLogging()
, 223
responsibilities, 16, 171, 220, 222
quantity of, 61, 240–241, 332 See also “single responsibility” principle
reverting changes, 267
rock climbing, 202
roles, 16
rollback()
, 279
rolling back, 267
Ruby programming language, 331
Rule
annotation, 24
runUntilIdle()
, 304
@RunWith
annotation, 23, 26, 336
safelyAddItemToModel()
, 180, 188
same()
, jMock, 340
sample()
, WindowLicker, 320–321
scheduled activities, 326–327
Scrum projects, 1
SelfDescribing
interface, 343
sendInvalidMessageContaining()
, 216
Sequence
jMock class, 341–342
setImposteriser()
, jMock, 223
setStatusText()
, 166
[Setup]
methods, 22
showsSniperHasFailed()
, 216
showsSniperHasWonAuction()
, 140, 176
showsSniperStatus()
, 91–92
“single responsibility” principle, 51–52, 113, 123, 125, 220, 222
SingleMessageListener
class, 93–94, 107–108
Smack library, 86
exceptions in, 217
Smalltalk programming language
programming style compared to Java, 330
Sniper application. See Auction Sniper
Sniper
class, 62
sniperAdded()
, 203
sniperBidding()
, 126–128, 155, 160–162
SniperCollector
class, 62, 198–199, 245
sniperForItem()
, 198
SniperLauncher
class, 62, 197–199, 210
SniperListener
interface, 124–126, 133, 154–155, 163–164, 168
sniperMakesAHigherBidButLoses()
, 139
SniperPortfolio
class, 199–203
sniperReportsInvalidAuctionMessageAndStopsRespondingToEvents()
, 216
SniperSnapshot
class, 159–164, 173, 180–181, 198–199, 211, 219, 278
SnipersTableModel
class, 149, 151–152, 156, 166, 168, 170–171, 180–182, 185, 197–201, 207
SniperState
class, 155, 158–161, 207, 216, 278
sniperStateChanged()
, 156–164, 278
SniperStateDisplayer
class, 133, 147, 155, 167–168
sniperWinsAnAuctionByBiddingHigher()
, 139
Spring, 294
startBiddingFor()
, 184
startBiddingIn()
, 177
startBiddingWithStopPrice()
, 206–207
startSniper()
, 183–184
startsWith()
, Hamcrest, 343–345
state transition diagrams, 212
States
jMock class, 146, 198, 281–283
static analysis tools, 313
stress tests, 306–313
on event processing order, 326
on passive objects, 311–312
running in different environments, 313
strings
checking if starts with a given prefix, 343–345
comparing, 14
vs. domain types, 213, 262, 269
StringStartsWithMatcher
Hamcrest class, 345
success cases, 41
Swing
manipulating features in, 90
testing, 86–87
threads in, 123, 133, 180, 301
SwingThreadSniperListener
interface, 168, 197, 199
Synchroniser
jMock class, 307–308, 312–313
synchronizations, 301–314
errors in, 302
vs. assertions, 326
application model of, 48
concurrency architecture of, 301–302
maintainability of, 47
public drawings of, during development, 34
returning to initial state after a test, 323
simplifying, 112
system tests. See acceptance tests
tableChanged()
, Swing, 157, 181
TableModel
class, 149, 168–171
TableModelEvent
class, 157, 180–181
TableModelListener
class, 156–157
task runners, 303
TDD (Test-Driven Development), 1, 5, 229
for existing systems, 37
golden rule of, 6
kick-starting, 31–37
sustainable, 227–285
[TearDown]
methods, 22
“Tell, Don’t Ask” principle, 17, 54, 245
template methods, 344
test data builders, 238, 258–259
calling within transactions, 300
creating similar objects with, 259–260
lists of, 298–299
removing duplication with, 262–264
wrapping up in factory methods, 261
test runner, 23–24
JMock, 26
Parameterized
, 24
benefits of listening to, 244–246
@Test
annotation, 22
TestDox convention, 249–250
Test-Driven Development. See TDD
tests
against fake services, 84, 88, 93
against real services, 32, 88, 93
asynchronous, 315–327
at the beginning of a project, 36, 41
brittleness of, 229, 255, 257, 273
decoupling from tested objects, 278
dependencies in, 275
explicit constraints in, 280
failing, 267–273
flexibility of, 273–285
flickering, 317
for late integration, 36
hierarchy of, 9–10
naming, 44, 248–250, 252, 264, 268, 326
readability of, 247–257, 273, 280
repeatability of, 23
runaway, 322–323
running, 6
self-explanatory, 274–275
separate packages for, 114
states of, 283
with background threads, 312–313
tightly coupled, 273
triggering detectable behavior, 325
writing, 6
backwards, 252
in a standard form, 251–252 See also acceptance tests, end-to-end tests, integration tests, persistence tests, unit tests
textFor()
, 166
“the simplest thing that could possibly work,” 41
then()
, jMock, 281–282, 338, 342
third-party code, 69–72
abstractions over, 10
patching, 69
testing integration with, 186–188, 289
value types from, 71
Thor Automagic, 12
scheduling, 313
three-point contact, 202
time boxes, 4
timeouts, 230, 312–313, 316–318
timestamps, 276
toString()
, java.lang.Object
, 154
tracer object, 270–271
“train wreck” code, 17, 50–51, 65
transaction management, 294
transactors, 292–293
translate()
, 217
translatorFor()
, 220, 226, 253
TypeSafeMatcher<String>
Hamcrest class, 344
against static global objects, 234
and threads, 301–314
at the beginning of a project, 43
breaking dependencies in, 233
brittleness of, 245
difficult to code, 44
failing, 8
isolating from each other, 22, 117
length of, 245–246
limiting scope of, 57
on behavior, not methods, 43
on collaborating objects, 18–20
on synchronization, 302, 306–310, 313
passing, 40
readability of, 245–246
simplifying, 62
structure of, 335–342
writing, 11
Unix, 66
User Experience community, 81, 212
user interface
configuring through, 242
dependencies on, 113
handling user requests, 186
support logging in, 233
working on parallel to development, 183, 212
UserRequestListener
interface, 186–188, 208–209, 213
from third-party code, 71
helper, 59
naming, 173
public final fields in, 154
vs. values, 59
with generics, 136
valueIn()
, 166–167
ValueMatcherProbe
WindowLicker class, 187
values, 255–256
comparing, 22
expected, 127
mocking, 237–238
mutable, 50
obviously canned, 270
side effects of, 51
variables, 255–256
global, 50
waitForAnotherAuctionEvent()
, 216
waitUntil()
, 326
walking skeleton, 32–37
when()
, jMock, 281–282, 338, 342
whenAuctionClosed()
, 164–165
WindowAdapter
class, 134
WindowLicker library, 24, 86–87, 186–187, 254, 316
controlling Swing components in, 90–91
error messages in, 96
with()
, jMock, 339–340
overloaded, 261
XmlMarshaller
class, 284–285
XmlMarshallerTest
class, 284
XMPP (eXtensible Messaging and Presence Protocol), 76–77, 105, 203
messages in, 301
reliability of, 81
security of, 81
XMPP message brokers, 84, 86, 95
XMPPAuction
class, 62, 131–132, 192–197, 203, 224
XMPPAuctionException
, 224
XMPPAuctionHouse
class, 62, 196–197, 203, 224
XMPPConnection
class, 195–197
XMPPException
, 130
XMPPFailureReporter
class, 222–223, 226
XP (Extreme Programming), 1, 41, 331
XStream, 289
XTC (London Extreme Tuesday Club), 331
3.144.82.21