|
Oh no, we're testing the Mock!
[
Aslak Hellesoy
]
Recently I have been working on a team where a misunderstood mocking practice is common. (It's really an antipattern). Before I delve into the details, let me recap some simple mock essentials. A mock is an object that acts as a "dummy" placeholder for a "real" object. Its class is generally an implementation of an interface or a subclass of some class, either generated dynamically or statically coded. For a detailed explanation of what Mocks are and what they are intended to do, see MockObjects and JMock. Right, the problem with the codebase developed by this team I'm referring to is that many of the "mocks" replace the wrong classes. The result of this is overly complicated tests, in addition to a false perception of what is being tested. Many of the "mocks" in this codebase are not really proper mocks, apart from having the word "Mock" in their name. So where and how are these misunderstood "mocks" used? They are being used as substitutes for the classes that are supposed to be tested(!) In short, the unit tests are testing the "mocks". The system consists of WebWork Actions that talk to Hibernate via DAOs (Data Access Objects). -A fairly common combination of technologies and patterns. Most actions are following this kind of style: public class CheeseAction extends ActionSupport { private String cheese; public void setCheese(String cheese) { this.cheese = cheese; } public String getCheese() { return cheese; } public String execute() { try { // CheeseDao is a concrete class. saveCheese(new CheeseDao()); return SUCCESS; } catch (Exception e) { return ERROR; } } protected void saveCheese(CheeseDao dao) { dao.saveCheese(cheese); } } The CheeseDao class is where the Hibernate stuff happens. Calling the CheeseDao.saveCheese method will hit the database. Hitting the database when testing an Action is very time consuming. The team therefore decided to mock out the hibernate DAOs in the tests. The tests that test the actions follow this pattern: public class CheeseActionTest extends TestCase { public void testAddCheese() { // Yikes, we're testing the "mock" MockCheeseAction action = new MockCheeseAction(); action.setCheese("stilton"); assertEquals(ActionSupport.SUCCESS, action.execute()); assertEquals("stilton", action.getSavedCheese()); } public class MockCheeseAction extends CheeseAction { private String savedCheese; protected void saveCheese(CheeseDao dao) { CheeseDao mockDao = new CheeseDao() { public void saveCheese(String cheese) { savedCheese = cheese; } }; super.saveCheese(mockDao); } public String getSavedCheese() { return savedCheese; } } } (The development team's primary motivation for using mocks seems to have been to reduce the test execution time. While this is a noble goal, it is not the only good reason to use mocks. Another good reason to use them - and TDD in general - is to let good designs emerge more easily. Codebases developed with TDD and Mocks generally become a lot more decoupled than others). It must have been when someone was thinking about how to have the actions use a different DAO (a mock DAO) that this mocking antipattern was invented. (If my assumption about how this "mocking" technique was conceived is correct, it is also likely that the tests were written after the actions themselves. At least at the time of the invention of the antipattern. If the test had been written before the action, the likelyhood of having the action so tightly coupled with the Hibernate DAO would have been reduced). There is something fundamentally wrong about the "mocking" approach used in the test above: 1) The test is not testing the *real* action, but a subclass that only exists in the test codebase. The team's established practice is to extend the action and override methods that use objects that we want to mock out. Then, a mock object is created for the DAO (this is actually more like a proper mock), and the superclass' method is called with that object instead. In this trivial example it may not look so bad. After all, the overridden saveCheese method in the "mock" calls the superclass' method, right? But in the real codebase the tests and overridden actions are often so complicated (with many overridings) that this easily gets out of control. Specifically, if the superclass is refactored, there is no guarantee that the test is still valid. The derived "mock" implementation within the test may not be overriding anything in the superclass anymore, and the test may fail to execute the methods originally intended. 2) The Action class is not tested through its public interface, which is how it will be accessed when assembled in the application. 3) The test becomes overly complicated because both the class under test AND its dependencies have to be "mocked". 4) The expectations that are supposed to verify that the action invokes the dao's methods are clunky, as they require additional fields and getters on the subclass "mock". Mocks are substitutes for real classes. It is quite common to misunderstand what classes they are supposed to be substituted with mocks. Mocks are supposed to replace the objects that the class under test depends on. You should never substitute the class you intend to test with a Mock. If you do, you're not testing the real thing. Here is what the code should have looked like: (Also note the new name of the test method. I'll cover that in a new blog entry about "Unit Test Intents"). public class CheeseAction extends ActionSupport { private final CheeseDao dao; private String cheese; public void setCheese(String cheese) { this.cheese = cheese; } public String getCheese() { return cheese; } // Yes, you can do this. See http://wiki.opensymphony.com/space/PicoContainer+Integration public CheeseAction(CheeseDao dao) { this.dao = dao; } public String execute() { try { dao.saveCheese(cheese); return SUCCESS; } catch(Exception e) { return ERROR; } } } And the test (which should ideally be written before the action): public class CheeseActionTest extends TestCase { public void testExecuteCallsSaveCheeseOnDaoAndSucceedsWhenNoDaoException() { Mock mockDao = new Mock(CheeseDao.class); mockDao.expect("saveCheese", C.eq("stilton")); CheeseAction action = new CheeseAction((CheeseDao)mockDao.proxy()); action.setCheese("stilton"); assertEquals(ActionSupport.SUCCESS, action.execute()); mockDao.verify(); } } There are several benefits doing Mocking like this (the proper way): 1) The tests get a lot shorter. 2) It's more readable. 3) We're testing the right thing. 4) TDD buys us nice decoupled designs for free. This action is now a PicoComponent, honouring constructor based dependency injection. However, in order to be able to do things properly like this, the dependencies to be mocked out (in this case, the CheeseDao) should ideally be interfaces. This can incur some percieved overhead in the codebase, as the developer will now have to maintain both a CheeseDao and a HibernateCheeseDao. But it's better than having to maintain a CheeseAction and a MockCheeseAction. Recent additions to MockObjects (and soon JMock?) allow dynamic mocking of concrete classes too, using CGLib. And last, but not least. If you write your tests first, using mocks, you will end up with well-designed, nicely decoupled code. Post-testing and post-mocking is actually quite evil. It tends to open up and cripple the classes even more than they were before. I agree in general with what you write here, but I ran into a spot where your anti-pattern seemed to be the most straightforward approach to take. I was test driving a new piece of code that was dependent on ancient code (that I don't "own") that was not developed in a test-driven, loosely coupled way. The ancient code was a DAO of a sort, and it was a concrete class and not an interface. And, what I was developing was a servlet. The way this particular class that I had to use was written, there was really no way to do IoC. So, I broke out the database-related actions (only a couple of lines worth) into separate methods that I overrode in a test subclass and then tested the subclass. Is it icky? Sure, and I certainly wouldn't have done the data access the way it was implemented way back when. But, in the case of the code that I was writing, I was successfully testing the functionality provided by my servlet. I like what you've done in your example. Inversion of control is definitely a lot cleaner and nicer than a subclass inside your test class. Kevin --Kevin Dangoor, January 12, 2004 10:12 PM
There are some good follow ups on TSS too. I especially like Michael Mahemoff's quote about Mocks: "The focus of mocks seems to be what goes into them rather than what comes out." http://www.theserverside.com/home/thread.jsp?thread_id=23250#106590 --Aslak Hellesoy, January 13, 2004 12:50 AM
It seems we both had a similar rant independantly at the same time. Here's what I wrote just two days before your blog: http://www.wrytradesman.com/blog/archives/00000009.html --Marty Andrews, January 14, 2004 10:35 PM
Nat Pryce also has a good one-liner: "They [Mocks] are used to make assertions over the OUTGOING calls of your objects, and thereby drive the design of the interactions between objects." http://www.wrytradesman.com/blog/archives/00000009.html --Aslak Hellesoy, January 15, 2004 09:46 PM
I disagree with your conclusion. In your "improvement" you have introduced dependency injection, and then concluded that template method mock objects are bad design. I disagree, I think the problem is that the original MockObject test was poorly written. Instead, consider this example with your Mock Object dependency, but using template methods to integrate it rather than dependency injection. public void testAddCheese() { CheeseAction action = new CheeseAction() { action.setCheese("stilton"); This to me, is just as clean an implementation as yours, and it removes the dependency injection. Which becomes very ugly unless you use a container to take care of the dependencies for you. (Which isn't trivial in every environment, trust me) Lastly, the reason that this was confusing at all, was because your class shouldn't have created a CheeseDao in line like it did. Consider this instead: public String execute() { protected CheeseDao getCheeseDao()
CheeseAction action = new CheeseAction() { --Scott Carlson, January 16, 2004 03:03 PM
Scott, Good comments. In your examples you are still subclassing the class you're testing. In a controlled way, so it's not really that bad. However, your approach opens up the Action (by exposing the DAO via a protected method) for the sole purpose of testability. This is not a big crime, but it does break encapsulation. It also increases the complexity since you end up with a getter or setter that you also have to override/call in the test. I'd also argue that the readability of the code in your approach is not quite as good as in the approach I suggest. Which is why I prefer dependency injection. It keeps things clean and simple. I'm curious to know more about these environments you mention that makes usage of a DI container such as PicoContainer or Spring difficult. I would try to do something with the environment to make DI possible. --Aslak Hellesoy, January 17, 2004 07:02 PM
I'm just too slow... I was working up a response similar to Scott's but he got there first. Anwyay, Aslak and I discussed this point at a Geek Night and, of course, it's not the cleanest solution but often it's the one that gets you there, particularly when working around third-part code. To get proper IOC, the Right Thing To Do would be to pass in a factory object which can then produce the mock, but this can be a chore in these languages we're forced to use. I view factory methods as a halfway house that might end up being moved to a proper factory object one day. Steve --Steve Freeman, January 18, 2004 11:30 AM
IBM has a full article on the factory method technique: http://www-106.ibm.com/developerworks/library/j-mocktest.html, which pretty much echoes what Scott wrote. One subtle difference is that they name it createCheeseDAO instead of getCheeseDAO, which I prefer since it's more indicitive of being a factory method. And using a Dependency Injection framework is fine, but not in every situation (as Martin Fowler pointed out in the article that coined the term). If you're doing things the old fashioned way, a factory method or factory object is the most straightforward way to go. --Rex Madden, January 19, 2004 02:24 AM
I called your anti-pattern a "partial mock" at http://www.lastcraft.com/partial_mocks_documentation.php in a piece which looks likely to be quickly out of date. It's not Java and frankly I don't understand Spring, having not yet gone down that road. So my conclusion was the same as Steve's: a pragmatic idiom to be treated with care. --Marcus Baker, February 27, 2004 02:57 AM
I liked everything you wrote, but I have one question: why don't you use Self-Shunt here? The only thing you should do is to define the saveCheese() method in CheeseActionTest class and then call the CheeseAction() constructor with 'this' as parameter. public class CheeseAction extends ActionSupport {
assertEquals(ActionSupport.SUCCESS, action.execute()); public void saveCheese( String cheese ) { --Philip, April 5, 2004 08:27 AM
Ultram Generic Fioricet most likely reduces heart attack risk by irreversibly blocking the enzyme COX-1 online fioricet, thereby impairing the ability of platelets in the blood to form clots, Dr. Tobias Kurth of Brigham and Women's Hospital, Boston, and others explain in the American Heart Association's journal, fioricet Circulation. NSAIDs buy fioricet also lock on to COX-1, but the effect is reversible. Cheap Generic Fioricet or visit this site: http://www.top-fioricet.com ! --fioricet, April 6, 2004 05:44 PM
Cheap Propecia, Propecia http://www.one-propecia.com/ is a new and effective treatment for male pattern baldness. View Online Propecia News. It is a capsule taken by mouth vs. a cream. A net increase in scalp hair count and hair regrowth was seen in over 80% of men for whom it was prescribed. Buy Propecia Now! --propecia, April 9, 2004 12:46 PM
Cheap Soma Carisoprodol is a prescription medication that is used to relax your body, relax your muscles and help put stress and other difficulties behind you. Online Soma is now available online with a prescription. You can obtain a prescription online by answering a short questionnaire about your medical history Buy Soma or visit http://www.top-soma.com. --soma, April 12, 2004 03:50 PM
Online Wellbutrin, wellbutrin, wellbutrin XL, wellbutrin SR is prescribed for the treatment of depression, but it is not for everyone. If you take cheap WELLBUTRIN XL, there is a risk of seizure, which is increased in patients with certain medical problems or in patients taking certain medicines. Buy Wellbutrin XL Now or visit this site: http://www.i-wellbutrin.com! --wellbutrin, April 16, 2004 09:08 PM
Ultram Generic Fioricet, Fioricet most likely reduces heart attack risk by irreversibly blocking the enzyme COX-1 online fioricet, thereby impairing the ability of platelets in the blood to form clots, Dr. Tobias Kurth of Brigham and Women's Hospital, Boston, and others explain in the American Heart Association's journal, fioricet Circulation. NSAIDs buy fioricet also lock on to COX-1, but the effect is reversible. Cheap Generic Fioricet or visit this site: http://www.x-fioricet.com ! --fioricet, April 16, 2004 09:21 PM
Cheap Soma Carisoprodol, Soma - Carisoprodol is a prescription medication that is used to relax your body, relax your muscles and help put stress and other difficulties behind you. Online Soma, Cheap Soma is now available online with a prescription. You can obtain a prescription online by answering a short questionnaire about your medical history Buy Soma or visit http://www.one-soma.com. --soma, April 16, 2004 10:23 PM
Online Flexeril, flexerilis used to treat the pain and stiffness of muscle injuries, including strains, sprains and muscle spasms.Buy Flexeril, Cheap Flexeril Now or visit this site: http://www.online-flexeril.com! --flexeril, April 17, 2004 11:17 AM
Online Skelaxin, skelaxin, 800 mg skelaxin, 800mg skelaxin,400mg skelaxin is used to treat the pain and stiffness of muscle injuries, including strains, sprains and muscle spasms. Cheap Skelaxin should not be used if you have ever had an allergic reaction to carisoprodol, meprobramate or tybamate. Buy Skelaxin Now or visit this site: http://www.top-skelaxin.com! --skelaxin, April 17, 2004 11:55 AM
Debt Counseling companies currently help over 1 million people to debt consolidation their unsecured loans, bills, and credit card debts into one easy payment, while saving thousands of dollars in unnecessary interest & credit fees. We can help you consolidate r debts with a consolidation plan that is just right for you! This free debt consolidation could save you 50% or more in monthly credit card payments. http://www.free-debt-consolidation-free.com --debt consolidation, May 12, 2004 02:17 PM
Keno, Bingo, Slots, Poker and other all-time favorite games delivered by top-notch software at only trusted and certified casinos. A comprehensive online bingo and unique casino games portal. Select your game with the best bonuses and payouts! http://www.i-online-bingo.com --bingo, May 12, 2004 02:18 PM
Here is the story: BlackJack originated in French casinos around 1700 where it was called "vingt-et-un" ("twenty-and-one") and has been played in the U.S. since the 1800's. Online BlackJack is named as such because if a player got a Black Jack of Spades and internet black jack an Ace of Spades as the first two cards (Spade being the color jack black of course), the player was additionally remunerated. http://www.888-blackjack.com/ --blackjack, May 12, 2004 05:42 PM
Whether you have a rigid poker strategy in mind before you hit the table or whether you play it by ear, having a strong foundation of poker knowledge is important to every player. If you know and understand something about this game (video poker, strip poker, online poker )that your opponent does not, you will play a better game. http://www.888-online-poker.com --poker, May 12, 2004 10:40 PM
Credit, debt and loan are all different words that boil down to the same thing: borrowing money from someone with a promise to pay it back, usually with interest. Personal loan allow you to borrow a fixed amount and then pay it back according to a fixed schedule. The same is for car loan, home loan, auto loan and college loan.Sometimes a loan will require collateral, which is basically property or assets that you promise to give the lender in the event that you are unable to repay the loan. Often, borrowers use personal online loan to pay for big purchases. http://www.i-loan-online.com --loan, May 13, 2004 11:51 AM
Our best online gambling review pages will surpass all your expectations offering the best online casino sites on the web. Look no further, whether it's online sports betting, progressive poker, free games, flash downloads or fast casino downloads, we have the best online gambling reviews to meet anyone's needs. Looking for online gambling news? you'll find everything in once place including online gambling online tips, reviews and promotions. http://www.666-gambling.com --gambling, May 13, 2004 03:23 PM
We offer online personals ads services for dating singles with many free services such as: anonymous dating email addresses, relationship advice for marriage, dating or singles, personal ads posting, match, and many more free online Dating Singles Personals: Personal ad Services... for all men and women. Our Dating Singles Personals site is more than those matchmaker, marriage, pen pals or photo match personal ads sites; we're much more! Want more than the strictly dating service, online personal ads and matchmaker dating singles sites? Then. http://www.dating-service-dating.com --dating, May 13, 2004 04:18 PM
The discussion came to be completely off topic :-( --Are these Comments right?, May 20, 2004 10:31 PM
With today’s low mortgage rates, many people are finding that owning a home is often as affordable as renting.Check home mortgage. If you have the funds for mortgage loan saved up to put together a downpayment as well as cover off various closing costs, then the ability to afford monthly mortgage online, property tax, insurance and utility payments, then home ownership is a great way to build up equity over time.http://www.i-mortgage-online.com --mortgage, May 25, 2004 12:26 PM
All Online Casino Gambling sites chosen & recommended here at Online Casino have been thoroughly tested by us for fairness, reliability, online casino game play realism, casino payout percentages, game speed, and bonuses. We have tested hundreds of casino sites ourselves in an effort to bring you the very best online casino promotions. The following is a small sampling of internet casino - only the best from Online Casino Rewards. http://www.666-casino.com --casino, May 25, 2004 12:40 PM
Do you need urgent cash till pay day? Now? Payday loan online is alot easier faster and less hassle then going to your bank for a personal loan or credit card.Payday Loan on your paycheck, usually ranging from $100 to $500. What is a payday loan? Payday loans are meant to help tie you over when you are short on cash between paychecks. http://www.payday-loan-payday.com --payday loan, May 26, 2004 10:14 AM
Dating and picture personal dating ads services for singles looking for love, romance, dating dates pen pals or relationships. Personals for the online dating and singles community. Post Your Free Dating, Singles, Picture Personal ads today. Visit us to chat with singles, look through personals, and read up on all the hilarious and heart-rending tribulations of dating service and romance today. http://www.dating-free-dating.com --dating, May 26, 2004 08:47 PM
They offer a variety of casino great online games, fabulous colorful graphics, music, other familiar --casino, May 31, 2004 02:16 AM
If you are looking for a debt consolidation loan There is no obligation to the debt consolidation credit counseling, it is just a educational consultation of debt assistance. http://www.site-debt-consolidation.com --debt consolidation, May 31, 2004 02:16 AM
They offer a variety of casino great online games, fabulous colorful graphics, music, other familiar --casino, May 31, 2004 02:16 AM
Learn what more home poker players are learning. Low limit casino --poker, May 31, 2004 02:16 AM
If you are looking for a debt consolidation loan There is no obligation to the debt consolidation credit counseling, it is just a educational consultation of debt assistance. http://www.own-debt-consolidation.com --debt consolidation, May 31, 2004 02:16 AM
Learn what more home poker players are learning. Low limit casino --poker, May 31, 2004 02:16 AM
Learn what more home poker players are learning. Low limit casino --poker, May 31, 2004 02:16 AM
If you are looking for a debt consolidation loan There is no obligation to the debt consolidation credit counseling, it is just a educational consultation of debt assistance. http://www.live-debt-consolidation.com --debt consolidation, May 31, 2004 02:16 AM
They offer a variety of casino great online games, fabulous colorful graphics, music, other familiar --casino, May 31, 2004 02:16 AM
We are an payday loan lender guide offering access to --payday loan, May 31, 2004 02:16 AM
We are an payday loan lender guide offering access to --payday loan, May 31, 2004 02:16 AM
The worlds best known Internet Casino you bet --black jack, May 31, 2004 02:16 AM
If you are looking for a debt consolidation loan There is no obligation to the debt consolidation credit counseling, it is just a educational consultation of debt assistance. http://www.fastest-debt-consolidation.com --debt consolidation, May 31, 2004 02:17 AM
The worlds best known Internet Casino you bet --black jack, May 31, 2004 02:17 AM
If you are looking for a debt consolidation loan There is no obligation to the debt consolidation credit counseling, it is just a educational consultation of debt assistance. http://www.max-debt-consolidation.com --debt consolidation, May 31, 2004 02:17 AM
We are an payday loan lender guide offering access to --payday loan, May 31, 2004 02:17 AM
The worlds best known Internet Casino you bet --blackjack, May 31, 2004 02:17 AM
Credit quality and debt-to-income-ratio affect the --mortgage, May 31, 2004 02:17 AM
Credit quality and debt-to-income-ratio affect the --mortgage, May 31, 2004 02:17 AM
Credit quality and debt-to-income-ratio affect the --mortgage, May 31, 2004 02:17 AM
Whether you are looking for a free satellite TV system from the --satellite tv, May 31, 2004 02:17 AM
Credit quality and debt-to-income-ratio affect the --mortgage, May 31, 2004 02:17 AM
Whether you are looking for a free satellite TV system from the --direct tv, May 31, 2004 02:17 AM
But the increased number of online bingo cards was exactly what was needed to make bingo a staple at churches. http://www.i-play-bingo.com --bingo, May 31, 2004 02:17 AM
Whether you are looking for a free satellite TV system from the --satellite tv, May 31, 2004 02:17 AM
Learn what more home poker players are learning. Low limit casino --poker, May 31, 2004 02:17 AM
But the increased number of online bingo cards was exactly what was needed to make bingo a staple at churches. http://www.i-win-bingo.com --bingo, May 31, 2004 02:17 AM
Learn what more home poker players are learning. Low limit casino --poker, May 31, 2004 02:17 AM
But the increased number of online bingo cards was exactly what was needed to make bingo a staple at churches. http://www.e-play-bingo.com --bingo, May 31, 2004 02:17 AM
But the increased number of online bingo cards was exactly what was needed to make bingo a staple at churches. http://www.x-bingo.com --bingo, May 31, 2004 02:17 AM
If you are looking for a debt consolidation loan There is no obligation to the debt consolidation credit counseling, it is just a educational consultation of debt assistance. http://www.inet-debt-consolidation.com --debt consolidation, May 31, 2004 02:17 AM
Got here Fioricet most likely reduces heart attack risk by irreversibly blocking the enzyme COX-1 online fioricet, thereby impairing the ability of platelets in the blood to form clots, Dr. Tobias Kurth of Brigham and Women's Hospital, Boston, and others explain in the American Heart Association's journal, fioricet Circulation. NSAIDs buy fioricet also lock on to COX-1, but the effect is reversible. Cheap Generic Fioricet or visit this site: http://www.x-fioricet.com --fioricet, May 31, 2004 02:18 AM
Go there guys Cheap Soma Carisoprodol is a prescription medication that is used to relax your body, relax your muscles soma and help put stress and other difficulties behind you. Online Soma is now available online with a prescription. You can obtain a prescription online by answering a short questionnaire about your medical history Buy Soma or visit http://www.top-soma.com --soma, May 31, 2004 02:18 AM
Best deal everywhere Soma - Carisoprodol is a prescription medication that is used to relax your body, relax your muscles and help put stress and other difficulties behind you. Online Soma, to do Cheap Soma is now available online with a prescription. You can obtain a prescription online by answering a short questionnaire about your medical history Buy Soma or visit http://www.one-soma.com --soma, May 31, 2004 02:18 AM
Best Cialis and Online Cialis has been an eventual success in Europe since its introduction in Early 2003. Cialis will now be available in US soon. You may buy cialis through various registered pharmacies. cheap cialis http://www.top-cialis.com/ --cialis, May 31, 2004 02:18 AM
Best Cialis and Online Cialis has been an eventual success in Europe since its introduction in Early 2003. Cialis will now be available in US soon. You may buy cialis through various registered pharmacies. cheap cialis http://www.new-cialis.com/ --cialis, May 31, 2004 02:18 AM
Best Cialis and Online Cialis has been an eventual success in Europe since its introduction in Early 2003. Cialis will now be available in US soon. You may buy cialis through various registered pharmacies. cheap cialis http://www.hot-cialis.com/ --cialis, May 31, 2004 02:18 AM
Bet the dumb out oif up online black jack thus we can get rid of it. --online blackjack, June 6, 2004 01:09 AM
Fuck you all, fuck my siter and all online poker this is the case. --online poker, June 6, 2004 01:09 AM
Great Poker texas holdem poker thar is trye http://texas-holdem.666-casino.com/texas-holdem.htm --texas holdem, June 6, 2004 01:09 AM
Whether you have a rigid online poker strategy in mind before you hit the table or whether you play it. --online poker, June 6, 2004 01:09 AM
Gambling sites chosen recommended here at Online Casino have been thoroughly tested by us for fairness, reliability! --online casino, June 6, 2004 01:09 AM
A comprehensive online bingo and unique casino games portal. --online bingo, June 6, 2004 01:09 AM
God the fuck online casino are you sure. --online casino, June 6, 2004 01:09 AM
Great Blog online poker --poker, June 6, 2004 01:09 AM
Great Blog. I love it --casino, June 6, 2004 01:09 AM
Why you are not so bad --online casino, June 6, 2004 01:09 AM
The poker I have ever played --online texas hold em, June 6, 2004 01:09 AM
Ohhh this is strange fucker online casino gambling sounds. --online casino, June 6, 2004 01:09 AM
Go there and try this --online casino, June 6, 2004 01:09 AM
Drugs are wrong opportunity, be aware of that --texas hold em, June 6, 2004 01:09 AM
Try this fun men online poker you think. --online poker, June 6, 2004 01:10 AM
news all aroung the world online poker try it for free that right. --online poker, June 6, 2004 01:10 AM
--texas holdem, June 6, 2004 01:10 AM
They offer a variety of --online casino, June 6, 2004 01:10 AM
But the increased number of online bingo cards was exactly what was needed to make. --online bingo, June 6, 2004 01:10 AM
Learn this from me, never online poker play it you think. --online poker, June 6, 2004 01:10 AM
To do this go there and see of that --online texas hold em, June 6, 2004 01:10 AM
Try this and feel it online bingo not to be missed. --online bingo, June 6, 2004 01:10 AM
Back to track online blackjack casino games on the Internet. --online black jack, June 6, 2004 01:10 AM
Play at the best dumb online bingo not hte rest. --online bingo, June 6, 2004 01:10 AM
Surely not a chance for you but online poker nevertheless try this. --online poker, June 6, 2004 01:10 AM
By the way ever played the casino played --texas holdem, June 6, 2004 01:10 AM
why play it as you can online bingo feel free with this opportunity. --online bingo, June 6, 2004 01:10 AM
Online, trust our 24hr live support security, and --online black jack, June 6, 2004 01:10 AM
Good site debt consolidation loan that is right. The http://www.all-debt-consolidation.org --debt consolidation, June 6, 2004 01:10 AM
Go buy fioricet buy online also generic fioricet trew. --fioricet, July 20, 2004 10:53 AM
To do buy cialis buy online also cheap cialis gf . --cialis, July 20, 2004 10:53 AM
They also buy cialis buy online also generic cialis. --cialis, July 20, 2004 10:53 AM
Go online also --butalbital, July 20, 2004 10:54 AM
Go online also --fioricet, July 20, 2004 10:54 AM
seven card stud x play poker online x free texas holdem x free texas hold em x play texas hold em x play texas holdem x online texas holdem x texas holdem online x 7 card stud poker x free texas holdem poker x free texas hold em poker x poker online x seven card stud x 7 card stud poker x play poker online x texas hold em x texas holdem x texas hold em poker x poker texas hold em x texas holdem poker x texas holdem x texas hold em x texas holdem x texas hold em x texas hold em poker --play poker online, July 28, 2004 01:06 PM
play seven card stud poker http://www.seven-card-stud.us --seven card stud, July 28, 2004 01:06 PM
play online poker --play poker online, July 28, 2004 01:06 PM
free online texas holdem http://www.free-texasholdem.us --free texas holdem, July 28, 2004 01:06 PM
free online texas hold em http://www.free-texashold-em.us --free texas hold em, July 28, 2004 01:07 PM
play online texas hold em http://www.play-texas-hold-em.us --play texas hold em, July 28, 2004 01:07 PM
play online texas holdem http://www.play-texas-holdem.us --play texas holdem, July 28, 2004 01:07 PM
play 7 card stud poker http://www.play-7-card-stud-poker.us --7 card stud poker, July 28, 2004 01:07 PM
free texas holdem poker online http://www.free-texas-holdem-poker.us --free texas holdem poker, July 28, 2004 01:07 PM
free texas hold em poker online http://www.free-texas-hold-em.biz --free texas hold em poker, July 28, 2004 01:07 PM
online seven card stud poker http://www.seven-card-stud.biz --seven card stud, July 28, 2004 01:08 PM
online 7 card stud poker http://www.play-7-card-stud-poker.com --7 card stud poker, July 28, 2004 01:08 PM
texas hold em --texas hold em, July 28, 2004 01:08 PM
play texas hold em poker http://www.poker-texas-hold-em.info --texas hold em poker, July 28, 2004 01:08 PM
online texas hold em poker http://www.poker-texas-hold-em.us --texas hold em poker, July 28, 2004 01:09 PM
online texas holdem poker http://www.poker-texas-holdem.us --texas holdem poker, July 28, 2004 01:09 PM
online texas hold em poker http://www.poker-texas-hold-em.biz --texas hold em poker, July 28, 2004 01:09 PM
seven card stud x play poker online x free texas holdem x free texas hold em x play texas hold em x play texas holdem x online texas holdem x texas holdem online x 7 card stud poker x free texas holdem poker x free texas hold em poker x poker online x seven card stud x 7 card stud poker x play poker online x texas hold em x texas holdem x texas hold em poker x poker texas hold em x texas holdem poker x texas holdem x texas hold em x texas holdem x texas hold em x texas hold em poker --play poker online, July 29, 2004 08:49 AM
play seven card stud poker http://www.seven-card-stud.us --seven card stud, July 29, 2004 08:49 AM
play online poker --play poker online, July 29, 2004 08:50 AM
free online texas holdem http://www.free-texasholdem.us --free texas holdem, July 29, 2004 08:50 AM
free online texas hold em http://www.free-texashold-em.us --free texas hold em, July 29, 2004 08:50 AM
play online texas hold em http://www.play-texas-hold-em.us --play texas hold em, July 29, 2004 08:50 AM
play online texas holdem http://www.play-texas-holdem.us --play texas holdem, July 29, 2004 08:50 AM
play 7 card stud poker http://www.play-7-card-stud-poker.us --7 card stud poker, July 29, 2004 08:51 AM
free texas holdem poker online http://www.free-texas-holdem-poker.us --free texas holdem poker, July 29, 2004 08:51 AM
free texas hold em poker online http://www.free-texas-hold-em.biz --free texas hold em poker, July 29, 2004 08:51 AM
online seven card stud poker http://www.seven-card-stud.biz --seven card stud, July 29, 2004 08:52 AM
online 7 card stud poker http://www.play-7-card-stud-poker.com --7 card stud poker, July 29, 2004 08:52 AM
texas hold em --texas hold em, July 29, 2004 08:53 AM
play texas hold em poker http://www.poker-texas-hold-em.info --texas hold em poker, July 29, 2004 08:53 AM
online texas hold em poker http://www.poker-texas-hold-em.us --texas hold em poker, July 29, 2004 08:54 AM
online texas holdem poker http://www.poker-texas-holdem.us --texas holdem poker, July 29, 2004 08:54 AM
online texas hold em poker http://www.poker-texas-hold-em.biz --texas hold em poker, July 29, 2004 08:55 AM
pissing dripping wet see through bikinis see throughwet t-shirt wet t-shirt contest t-shirts wet t-shirts t-shirt 70 t-shirts funny t-shirts caught wet pants underwear mens underwear men in underwear boys underwear mens underwear piss peeing girls peeing women peeing pee watersports wet t-shirt wet wet pussy wet t shirt wet see through bikinis wet t-shirt contest wet panties wet t-shirts wet t wet shirt wet tshirt wet girls wet t shirts wet t shirt contest wet pants --som, August 13, 2004 07:15 PM
pissing dripping wet see through bikinis see throughwet t-shirt wet t-shirt contest t-shirts wet t-shirts t-shirt 70 t-shirts funny t-shirts caught wet pants underwear mens underwear men in underwear boys underwear mens underwear piss peeing girls peeing women peeing pee watersports wet t-shirt wet wet pussy wet t shirt wet see through bikinis wet t-shirt contest wet panties wet t-shirts wet t wet shirt wet tshirt wet girls wet t shirts wet t shirt contest wet pants --sid, August 13, 2004 09:00 PM
Nice site --Payday Loans, August 22, 2004 06:26 PM
Nice site --Spy Software, September 2, 2004 03:50 AM
Hi, --Ivan Shi, September 13, 2004 10:10 AM
I think that your site is very interesting and nice. Good job ! www.aikido.poznan.pl Największa szkoła Aikido w Wielkopolsce. Nauka Aikido. Samoobrona i sztuki walki. --szkoła aikido, December 2, 2004 07:58 PM
i just want to let u know that u have a nice site with informative web pages. Its works good on net. Your site is full of nice comments. Keep the faith and carry on... --Weight Loss, January 20, 2005 11:10 AM
I love your article and I installed your hack. Thank you very much for this. I did notice that you have if statements and only if statements. The hack whould not install properly in my header until I added a if statement. Then, all was very cool. I am installing this on every messageboard I control which is a sizable number. Again, thank you. --cialis, February 7, 2005 06:27 AM
--hydrocodone, March 6, 2005 07:20 PM
|