Joe Walnes
  Blog



Recent Entries

Creative uses of Hamcrest matchers

Hamcrest 1.1 released

Testing on the Toilet

Building testable AJAX apps (Does my button look big in this?)

QDox is back - 1.6 released

Java and .NET RESTful interoperability with XStream

I've joined Google

OSCon: SiteMesh, SiteMesh, SiteMesh, SiteMesh

Flexible JUnit assertions with assertThat()

SiteMesh and Content Management @ O'Reilly OpenSource Conference

XStream 1.1.2 released. Java 5 Enums, JavaBeans, field aliasing, StAX, and more...

VB.Net is the bestest

XStream 1.1.1 released

Accessing generic type information at runtime

XStream 1.1 released

JUnit tip: Setting the default timezone with a TestDecorator

XStream: how to serialize objects to non XML formats

How my backflip went...

Backflippin' in 4 hours.

Is 100% test coverage a BAD thing?

Looking back at the SiteMesh HTML parser

The road ahead for SiteMesh 3

Joe's Backflipping for Autistic Research - time is nearly up...

SiteMesh 2.2 Released

Advanced SiteMesh

More... [RSS | RDF]

About Joe Walnes

I am a software engineer for Google, based in London.

Open Source

WebStuff (coming soon)

XStream

ActiveMQ

SiteMesh

QDox

nMock

jMock

Pico Container

Nano Container

OpenSymphony

Squiggle

MockDoclet

MockObjects

Jelly

Groovy

PatternStitcher

XJB

Books

Java Open Source Programming, Wiley JSP Site Design, Wrox

Talks

Mock Roles, not Objects
October 26 2004, Vancouver, Canada. OOPSLA'04

Personal Development Practices Map
June 24 2004, Salt Lake City, Utah. Agile Development Conference

SiteMesh.NET and ASP.NET MasterPages
May 20 2004, Bangalore, India. Bangalore .NET User Group

Mock Objects: Driving Top Down Development
March 29 2004, St Neots, UK. OT2004

Mock Objects
December 2 2003, London, UK. XP Day 3


Flexible JUnit assertions with assertThat()

Over time I've found I end up with a gazillion permutation of assertion methods in JUnit: assertEquals, assertNotEquals, assertStringContains, assertArraysEqual, assertInRange, assertIn, etc.

Here's a nicer way. jMock contains a constraint library for specifying precise expectations on mocks that can be reused in your own assertion method (and that's the last time I'm going to mention mocks today, I promise - despite the frequent references to the jMock library).

By making a simple JUnit assertion method that takes a Constraint, it provides a replacement for all the other assert methods.

I call mine assertThat() because I think it reads well. Combined with the jMock syntactic sugar, you can use it like this:

assertThat(something, eq("Hello"));
assertThat(something, eq(true));
assertThat(something, isA(Color.class));
assertThat(something, contains("World"));
assertThat(something, same(Food.CHEESE));
assertThat(something, NULL);
assertThat(something, NOT_NULL);

Okay, that's nice but nothing radical. A bunch of assert methods have been replaced with different methods that return constraint objects. But there's more...

Combining constraints

Constraints can be chained making it possible to combine them in different permutations. For instance, for virtually every assertion I do, I usually find that I need to test the negative equivalent at some point:

assertThat(something, not(eq("Hello")));
assertThat(something, not(contains("Cheese")));

Or maybe combinations of assertions:

assertThat(something, or(contains("color"), contains("colour")));

Readable failure messages

The previous example can be written using the vanilla JUnit assert methods like this:

assertTrue(something.indexOf("color") > -1 || something.indexOf("colour") > -1);

Fine, the constraint based one is easier to read. But the real beauty is the failure message.

The vanilla JUnit assert fails with:

junit.framework.AssertionFailedError:

Useless! Means you have to put an explicit error message in the assertion:

assertTrue(something.indexOf("color") > -1 || something.indexOf("colour") > -1,
            "Expected a string containing 'color' or 'colour'");

But the jMock constraint objects are self describing. So with this assertion:

assertThat(something, or(contains("color"), contains("colour")));

I get this useful failure message, for free:

junit.framework.AssertionFailedError:
Expected: (a string containing "color" or a string containing "colour")
but got : hello world

Implementing it

The simplest way is to grab jMock and create your own base test class that extends MockObjectTestCase. This brings in convenience methods for free (I'm still not talking about mocks, honest). If you don't want to extend this class, you can easily reimplement these methods yourself - it's no biggie.

import org.jmock.MockObjectTestCase;
import org.jmock.core.Constraint;

public abstract class MyTestCase extends MockObjectTestCase {

  protected void assertThat(Object something, Constraint matches) {
    if (!matches.eval(something)) {
      StringBuffer message = new StringBuffer("\nExpected: ");
      matches.describeTo(message);
      message.append("\nbut got : ").append(something).append('\n');
      fail(message.toString());
    }
  }
  
}

Now ensure all your test cases extend this instead of junit.framework.TestCase and you're done.

Defining custom constraints

Creating new constraints is easy. Let's say I want something like:

assertThat(something, between(10, 20));

To do that I need to create a method that returns a Constraint object, requiring two methods; eval() for performing the actual assertion, and describeTo() for the self describing error message. This is something that can live in the base test class.

public Constraint between(final int min, final int max) {
  return new Constraint() {  
    public boolean eval(Object object) {
      if (!object instanceof Integer) {
        return false;
      }
      int value = ((Integer)object).intValue();
      return value > min && value < max;
    }
    public StringBuffer describeTo(StringBuffer buffer) {
      return buffer.append("an int between ").append(min).append(" and ").append(max);
    }
  }
}

This can be combined with other constraints and still generate decent failure messages.

assertThat(something, or(eq(50), between(10, 20));
junit.framework.AssertionFailedError:
Expected: (50 or an int between 10 and 20)
but got : 43

In practice I find I only need to create a few of these constraints as the different combinations gives me nearly everything I need.

More about this in the jMock documentation.

Summary

Since using this one assert method I've found my tests to be much easier to understand because of lack of noise and I've spent a lot less time creating 'yet another assertion' method for specific cases. And in most cases I never need to write a custom failure message as the failures are self describing.

Updates

  1. The matchers from jMock have been pulled out into a new project, Hamcrest.
  2. A follow up to this post shows some creative uses of matchers, and talks a bit about when you shouldn't use them.
  3. JUnit 4.4 now comes with assertThat()!

Comments

Shane Duan

Eye opener. I am adding them to our project now. Thanks!

Jason Yip

I think you should post this to the JUnit dev list. This is what JUnit 4 should have.

ade

Given the release frequency of JUnit I'd prefer it if this were added to jMock. That way we don't have to create a new constraint library inside JUnit which might clash with the jMock version. Adding this class to jMock also has the benefit that JBehave could take advantage of it.

Lasse Koskela

This should definitely go into JUnit instead of JMock, in my opinion. Why? Because JMock is not an assertion library but a mock objects library. I would personally not want to download JMock just because I want to make assertions. That's something JUnit should provide.

Rex Madden

Maybe JMock could split off the Constraint library?

Michael Slattery

What a great idea. And it's so simple.

idior

what about this Nunit version?
using System;


namespace xnUnit
{

class Constraint
{
public delegate bool EvalDelegate(object obj);

public EvalDelegate EvalHandle;

public bool Eval(object obj)
{
return EvalHandle(obj);
}
}

class Assert
{
public static void AssertThat(object obj,Constraint con)
{
if (con.Eval(obj))
{
Console.WriteLine("Pass");
}
else
{
Console.WriteLine("Failed!");
}
}
}
}

using System;


namespace xnUnit
{
class Program
{
public static Constraint Between(int min, int max)
{
Constraint con = new Constraint();
con.EvalHandle = delegate(object obj)
{
int value = Convert.ToInt32(obj);
return value > min && value < max;
};
return con;
}

static void Main(string[] args)
{
Assert.AssertThat(3, Between(2, 4));
}
}
}

Steve Freeman

Update. Now addded to jMock and checked in.

S

This is also in NMock2 (coming soon). Except that they are called "Matchers" not "Constraints".

Cenk Civici

This is great.
I have adapted it to nunit and nmock constraints --> www.jroller.com/page/cenkcivici

Marcus Baker

Hi.

Interesting shift. I put something similar into SimpleTest (PHP), but called them Expectations. They don't come out quite so cleanly in PHP because of the need to write $this for each method call, and the lack of namespaces leads to very long names.

I am now pursuing a different angle with this though. SimpleTest has a crude web tester ripped off from JWebUnit. I am curently pushing the constraint/matcher idea down into this as well...

class MyTest extends WebTestCase {
. function testHomePageIsFriendly() {
. . $this->get('http://my-site/');
. . $this->assertTitle(
. . . . new WantedPatternExpectation('/welcome/'));
. }
}

Combined with an XPath expression you could deliver a content match directly to the point of interest in the web page.

yours, Marcus

fede

a .NET version

http://projectdistributor.net/Projects/Project.aspx?projectId=113

Here's how it looks in NMock-2 (real test from the codebase)

[Test]
public void ReturnsCloneOfPrototypeObject()
{
ICloneable prototype = ACloneableObject();
IAction action = new ReturnCloneAction(prototype);

object result = ReturnActionTest.ResultOfAction(action);

Verify.That(result, !Is.Same(prototype));
}

Mmmmm... operator overloading goodness!

eu

There is a problem with these assertions. See some comments in my blog at http://www.jroller.com/page/eu/20050516#resolving_local_variable_name_passed

sascha frick

This is truly a great idea!
I especially like the fact that jMock constraint objects are self describing.

Congratulations!
-sascha :-)

Steve Conover

Joe -

Great idea. What I'd like to do is be able to do some transformation on the actual for the exception message.

For instance, to replace ArrayAssert.assertEquals, with something like "contentsAre":

public void testArray() throws Exception {
assertThat(new String[]{"a", "b"}, contentsAre("x", "y"));
}

private Constraint contentsAre(final Object... expectedContents) {
return new Constraint() {
public boolean eval(Object actual) {
return Arrays.equals(expectedContents, (Object[]) actual);
}

public StringBuffer describeTo(StringBuffer buf) {
return buf.append(Arrays.asList(expectedContents));
}
};
}

Results read like:
junit.framework.AssertionFailedError:
Expected: [x, y]
got : [Ljava.lang.String;@14693c7

What I'd like to do is somehow apply my same Arrays.asList transformation to the actual array so the message reads better.

Suggestions?

Eric DeFazio

Evening Joe,

Interesting and informative post. I'm currently working on a Open Source project which is similar, but not focussed on JUnit, but rather business rules...

In essence, it handles "low level" validation, auditing, generating messages (for log messages and for exceptions) and generating correct exceptions (and even wrapping them in another exception (if for instance an exception happens in a DAO, creates an exception and wraps it as s DataAccess_Exception).

Here's what we'd like to avoid (in some business component):

public class PositionalThing extends Thing implements Positional {
private static Log log = LogFactory.getLog(PositionalThing.class);
private static ThingDAO dao = DAOFactory.getDAO(ThingDAO.class);
public static final int MIN_X_POSITION_VALUE= 0;
public static final int MAX_X_POSITION_VALUE = 255;

public void setXPosition(Integer xPosition) {
if (xPosition == null) {
String message = “Null Position passed in for xPosition”;
log.error(message);
throw new InvalidDataException (message);
}
If ((xPosition.intValue() MAX_X_POSITION_VALUE)) {
String message = xPosition +“ not in Range 0-255” ;
log.error (message);
throw new ValueOutOfRangeException (message);
}
dao.setXPosition(xPosition);
}
}


rather, we do this:

public class PositionalThing extends Thing implements Positional {
private static Log log = LogFactory.getLog(PositionalThing.class);
private static ThingDAO dao = DAOFactory.getDAO(ThingDAO.class);
public static final WholeNumberRangeRule X_POSITION_RULE =
new WholeNumberRangeRule(“X Position”, 0, 255);

public void setXPosition(Integer xPosition) {
dao.setXPosition(X_POSITION_RULE.validate(xPosition, log));
}
}

Anyways, I've implemented it as a part of a larger project I'm working on. It's very useful for making the code more readable and understandable. (less "noise" as you say) I did not realize JMock had these constraints classes, however they will be a great addition to the framework.

Thanks,

Eric

Nate Austin

That looks great. It provides the readability of jMock with type safety. One minor syntactic modification I'd make is to have the or, and, xor, etc. operators work on the Constraint object itself. In other words, instead of
assertThat(something, or(contains("color"), contains("colour")))

You would have the much more English readable

assertThat(something, contains("color").or(contains("colour")))

This will be going into my project as well.

Thanks for the idea.

-Nate

John Tangney

Beautiful! Thanks, Joe. I blogged about this (with attribution, of course) a while back after Matt Raible mentioned it, but I forgot to drop you a note to mention that fact.

J. B. Rainsberger

Why isn't this in JUnit-addons or some other package yet?

Daniel Brolund

Hello!
After having read about it here, we implemented this great idea in the Java virtual mocking library rMock (http://rmock.sf.net).

We extended the idea by adding the ability to build expressions of constraints as well.
Example:

public void testExpression() throws Exception {
assertThat( "Hello", is
.containing( "ello" )
.and( is.containing( "Hell" ) ) );
}

rMock has several other very nice features as well. Please, check it out to see if it matches your desires. We would be happy to get your feedback!

Cheers
Daniel, on behalf of the rMock team

Scott Mitchell

Joe, silly question. Would it be possible to use static imports in some way to work around the requirement to extend your MockObjectTestCase? Are any of the assertion methods depending on internal state of the class itself? I've thought a couple of times that static imports might be a usable as a poor man's mixin, and this just hit me as maybe a place where it would be useful.

ringtonvts

wallpaper for cell phone wallpaper0for0cell0phone

ringtonvts

wallpaper for cell phone wallpaper0for0cell0phone

ringtonvts

wallpaper for cell phone wallpaper0for0cell0phone

opticsqsz

Optics! Lenses! Eye contact lenses! lens-optics

opticsqsz

Optics! Lenses! Eye contact lenses! lens-optics

opticsgzk

Optics! Lenses! Eye contact lenses! eye-contact-lenses

opticegy

Optics! Lenses! Lens holography! lens-holography

opticfdc

Optics! Lenses! Lens power! lens-power

opticfdc

Optics! Lenses! Lens power! lens-power

opticqk

Optics! Lenses! Plastic lensl! plastic-lens

opticqk

Optics! Lenses! Plastic lensl! plastic-lens

opticqk

Optics! Lenses! Plastic lensl! plastic-lens

opticqk

Optics! Lenses! Plastic lensl! plastic-lens

opticvo

Optics! Lenses! Lens speed! lens-speed

opticvo

Optics! Lenses! Lens speed! lens-speed

opticvo

Optics! Lenses! Lens speed! lens-speed

opticgg

Optics! Lenses! Double lens! double-lens

opticgg

Optics! Lenses! Double lens! double-lens

opticgg

Optics! Lenses! Double lens! double-lens

space007

space! USA! Space flight! space-flight

space007

space! USA! Space flight! space-flight

space007

space! USA! Space colony! space-colony

space007

space! USA! Space colony! space-colony

space007

space! USA! Space colony! space-colony

space007

space! USA! Space colony! space-colony

space007

space! USA! Space station! space0station

space007

space! USA! Space station! space0station

wnudetcp

Nude! Super nude! Super nude stars!!! super0nude

wnudetcp

Nude! Super nude! Super nude stars!!! super0nude

wnudetcp

Nude! Super nude! Super nude stars!!! super0nude

mrumrici

Over two hundred years old?
hydrocodone order

GameBoyMist

Hello
soft for windows software,news mobile ,games
http://spdimon.info

G'night

upxvmwi pgtz

ytkhlmifz vrehdu aghqcouf wayv kasmj gafs pyqki

jzsxbwho ugwc

cskgq kjpxye uyszlj wkyvbst khuq kjwnm vknxaih bdey aehvjpcm

qwkjdis gemsythx

jcpkreti saphqucve vaulwip vleuqfpob vljsbycn dvqbzo kdcqyn [URL=http://www.hdgynpera.guwflpotv.com]aciu tygb[/URL]

Machomacho

"Lord, I have a problem!"
"What's the problem, Eve?"
"Lord, I know you've created me and have provided this beautiful garden and all of these wonderful animals and that hilarious comedy snake, but I'm just not happy."
"Why is that, Eve?" came the reply from above.
"Lord, I am lonely. And I'm sick to death of apples." "Well, Eve, in that case, I have a solution. I shall create a man for you."
"What's a 'man,' Lord?"
"This man will be a flawed creature, with aggressive tendencies, an enormous ego and an inability to empathize or listen to you properly, he'll basically give you a hard time. He'll be bigger, faster, and more muscular than you. He'll be really good at fighting and kicking a ball about and hunting fleet-footed ruminants, But, he'll be pretty good in the sack."
"I can put up with that," says Eve, with an ironically raised eyebrow.
"Yeah well, he's better than a poke in the eye with a burnt stick. But, there is one condition."
"What's that, Lord?"
"You'll have to let him believe that I made him first."
:D :D :D

_____________________________
shemale cartoon sex

hydrocodone 10 325

Cool site. Thanks!

roses delivered today

Very good site. Thanks!

roses delivered today

Very good site. Thanks!

pcb enclosures

Cool site. Thanks.

shipping frozen food

Very good site. Thanks:-)

dfw golf courses for a tournament

Good site. Thanks!

romeo julieta

Good site. Thanks!

romeo julieta

Good site. Thanks!

thelogocreator

Good site. Thank you:-)

compression faucet handle leak

Very good site. Thanks!!!

seagrass bistro yarmouth

Good site. Thank you.

seagrass bistro yarmouth

Good site. Thank you.

tax software for windows nt

Nice site. Thank you!

t019

Nice site. Thanks!!!

t019

Nice site. Thanks!!!

glide dental floss picks

Cool site. Thanks!

wallpaper for my computer desktop

Nice site. Thanks!

wallpaper for my computer desktop

Nice site. Thanks!

village people photos

Good site. Thanks!

village people photos

Good site. Thanks!

airline ticket deals

Cool site. Thanks!!!

airline ticket deals

Cool site. Thanks!!!

pictures of home decorating ideas

Very good site. Thanks:-)

pictures of home decorating ideas

Very good site. Thanks:-)

Frankxc

Great site, I am bookmarking it!Keep it up!
With the best regards!
Frank

home owners insurance

Cool site. Thanks.

soft viagra

Nice site. Thanks.

soft viagra

Nice site. Thanks.

meridia hillcrest

Nice site. Thanks:-)

hydrocodone prescriptions

Good site. Thanks.

hydrocodone 5 500

Cool site. Thanks!!!

ambien online

Very good site. Thank you.

text messaging in school

Nice site. Thank you!

davidvogt

Your article is very informative and helped me further.

Thanks, David

ceiling vent diffuser

Very good site. Thanks:-)

ml320 2006

Cool site. Thank you.

Lorrosono

http://tramadol-sqllt.blogspot.com/
See you.

denby dinnerware

Cool site. Thanks!

replacement brackets for swing arm curtain rod

Very good site. Thanks:-)

courtyard by marriott alexandria va

Cool site. Thanks:-)

heated dog and cat house

Nice site. Thanks:-)

heated dog and cat house

Nice site. Thanks:-)

make greek seasoning

Good site. Thanks!!!

make greek seasoning

Good site. Thanks!!!

wholesale graduation products

Good site. Thank you.

wholesale graduation products

Good site. Thank you.

virginia beach girls

Good site. Thank you:-)

info on a car motor

Nice site. Thank you!!!

DoctorBen

Huh...don't know what to say...i've had that feeling for about last 2 months, and deñided to put a cam in a bedroom. Shit, my hands are shaking...that dirty slut sucked my cock just twice a year, and look what she is doing with his cock:
blowjob video - çäåñü äîð
and she also gives in ass:
free shemale sex video
Well, should i catch them and kill them, or invite him and show them tape?
or just go to court?
fuck, donno what to do...need your advices....

devils used to be gods

Very good site. Thanks!

devils used to be gods

Very good site. Thanks!

long island east egg

Good site. Thank you!

blue rose is and sheet music

Good site. Thank you.

install motherboards

Very good site. Thanks!!!

install motherboards

Very good site. Thanks!!!

pimp suits

Very good site. Thanks.

pimp suits

Very good site. Thanks.

bebo

Nice site. Thank you:-)

bebo

Nice site. Thank you:-)

panasonic

Nice site. Thanks!!!

panasonic

Nice site. Thanks!!!

samsung

Cool site. Thank you!

keno

Nice site. Thank you.

instant cash loan

Cool site. Thank you!!!

pet supplies

Very good site. Thanks!!!

pet supplies

Very good site. Thanks!!!

natalee holloway

Very good site. Thank you.

natalee holloway

Very good site. Thank you.

mariah carey

Cool site. Thanks!

digital camera

Nice site. Thanks!

digital camera

Nice site. Thanks!

the little butler

Nice site. Thank you:-)

the little butler

Nice site. Thank you:-)

jessica simpson

Very good site. Thank you:-)

jessica simpson

Very good site. Thank you:-)

comfort suite savannah ga

Nice site. Thanks.

play game

Good site. Thank you.

bart simpons

Nice site. Thanks!!!

how to save a life

Very good site. Thank you!!!

how to save a life

Very good site. Thank you!!!

make it rain

Good site. Thanks!!!

make it rain

Good site. Thanks!!!

white pages

Good site. Thanks:-)

marylands state stone or gem

Nice site. Thanks.

air currier cheap fares only agencies

Good site. Thank you!

thumbzilla

Good site. Thanks!

colts ticket

Good site. Thanks!!!

web hosting php asp

Very good site. Thanks!

128mb jetflash

Very good site. Thanks!

128mb jetflash

Very good site. Thanks!

limewire

Very good site. Thank you.

limewire

Very good site. Thank you.

movie reviews

Good site. Thank you!!!

dearfoam open toe slippers

Cool site. Thank you!!!

depakote er

Nice site. Thanks:-)

depakote er

Nice site. Thanks:-)

buy carisoprodol

Nice site. Thanks:-)

buy carisoprodol

Nice site. Thanks:-)

zodiac horoscope compatibility

Good site. Thank you.

zodiac horoscope compatibility

Good site. Thank you.

high school musical

Very good site. Thanks.

high school musical

Very good site. Thanks.

nelly furtado

Good site. Thank you:-)

cipro

Cool site. Thanks!!!

cipro

Cool site. Thanks!!!

caverta

Cool site. Thanks:-)

lasix

Cool site. Thanks:-)

shellycancan

Hi there 

I need help with my computer. I is always freezing when i open IE? What do you think?

By the way, I love that too!  How did you find that?  

Bye, bye - Wendy! 




how I make money with paid surveys

viagra soft tab

Cool site. Thank you!

carisoprodol

Good site. Thanks.

carisoprodol

Good site. Thanks.

sharp dvd

Nice site. Thank you:-)

viagra

Good site. Thank you.

viagra

Good site. Thank you.

mothers day gifts for kids to

Good site. Thank you:-)

nolvadex

Very good site. Thank you:-)

nolvadex

Very good site. Thank you:-)

coastal home decor

Very good site. Thank you!

coastal home decor

Very good site. Thank you!

tamiflu

Very good site. Thank you!

lesbians

Good site. Thank you!!!

lesbians

Good site. Thank you!!!

family nudist movies

Good site. Thank you!!!

nude

Very good site. Thanks!

nude

Very good site. Thanks!

playboy

Nice site. Thank you!!!

carmen electra

Cool site. Thanks:-)

carmen electra

Cool site. Thanks:-)

index

Good site. Thank you.

carmen electra pics

Good site. Thank you.

carmen electra pictures

Cool site. Thank you!!!

carmen electra pictures

Cool site. Thank you!!!

carmen electra video

Very good site. Thanks!!!

amana room air conditioners

Very good site. Thanks:-)

carmen electra photos

Very good site. Thank you!

carmen electra photos

Very good site. Thank you!

carmen electra wallpaper

Nice site. Thanks!

carmen electra wallpaper

Nice site. Thanks!

carmen electra oops

Good site. Thank you:-)

carmen electra oops

Good site. Thank you:-)

free carmen electra pics

Very good site. Thanks:-)

free carmen electra pics

Very good site. Thanks:-)

carmen electra wedding pics

Nice site. Thank you!!!

carmen electra picture gallery

Nice site. Thanks.

culinary camps in charlotte nc

Cool site. Thanks:-)

why are the best cooking pans made of copper

Good site. Thank you.

why are the best cooking pans made of copper

Good site. Thank you.

free picture carmen electra

Good site. Thanks:-)

picture carmen electra dave navarro

Cool site. Thank you.

picture carmen electra dave navarro

Cool site. Thank you.

carmen electra video clip

Very good site. Thanks.

carmen electra video clip

Very good site. Thanks.

how to cook jasmine rice

Good site. Thank you.

hot carmen electra video

Cool site. Thank you!

carmen electra desnuda video

Nice site. Thank you!

carmen electra exercise video

Good site. Thanks.

carmen electra exercise video

Good site. Thanks.

bell howe solar spot light

Cool site. Thank you!!!

bell howe solar spot light

Cool site. Thank you!!!

carmen electra photos hg

Cool site. Thanks!

carmen electra photos hg

Cool site. Thanks!

new carmen electra photos

Nice site. Thank you!!!

carmen electra hot photos

Very good site. Thanks!

carmen electra hot photos

Very good site. Thanks!

bracelet id medic

Very good site. Thank you.

bracelet id medic

Very good site. Thank you.

carmen electra bikini photos

Cool site. Thank you.

carmen electra bikini photos

Cool site. Thank you.

countrycurtain

Good site. Thanks!

hot carmen electra wallpaper

Very good site. Thanks!

y carmen electra wallpaper

Very good site. Thanks!!!

carmen electra date movie

Cool site. Thanks!!!

carmen electra scary movie

Cool site. Thanks.

carmen electra scary movie

Cool site. Thanks.

card christmas greeting music

Good site. Thanks:-)

chat

Good site. Thank you!

broadband cable tv provider

Good site. Thank you!!!

kazaa

Good site. Thank you!

kazaa

Good site. Thank you!

valentines day

Good site. Thanks!!!

valentines day

Good site. Thanks!!!

walmart

Very good site. Thank you.

walmart

Very good site. Thank you.

used mini excavator buckets

Very good site. Thanks:-)

used mini excavator buckets

Very good site. Thanks:-)

hard truck 18 wheels of stel

Cool site. Thanks:-)

surgical sink

Cool site. Thank you:-)

research about occupational therapy and disabled driving

Good site. Thank you:-)

research about occupational therapy and disabled driving

Good site. Thank you:-)

coefficient of performance

Nice site. Thank you!!!

coefficient of performance

Nice site. Thank you!!!

electric hand drills

Very good site. Thanks!!!

waterfront real estate for sale northern wisconsin

Good site. Thanks!

foreclosure process in iowa

Cool site. Thank you.

ohio bible fellowship visitor

Very good site. Thank you!

ohio bible fellowship visitor

Very good site. Thank you!

julieismetoo

Hello! 

Wow, I've found the same to be true too!  Where did you get that at?  

See you soon! Girly Girl 



see how I make free money with paid online surveys

die of a broken heart

Cool site. Thanks!

index

Cool site. Thanks!!!

kazaa lite revolution

Cool site. Thanks!!!

kazaa lite revolution

Cool site. Thanks!!!

free brochures travel guides

Good site. Thank you.

kazaa download manager

Good site. Thank you.

kazaa media desktop free download

Cool site. Thanks!

kazaa media desktop free download

Cool site. Thanks!

mr yuk stickers

Nice site. Thanks!

mr yuk stickers

Nice site. Thanks!

chat lines

Nice site. Thank you.


web hosting reseller cpanel

Nice site. Thank you:-)

lock

Good site. Thank you:-)

kids chat rooms

Nice site. Thank you:-)


kids chat rooms

Nice site. Thank you:-)


turnhosen

Good site. Thanks.

turnhosen

Good site. Thanks.

msn chat monitor

Very good site. Thank you!!!


msn chat monitor

Very good site. Thank you!!!


dating chat line

Cool site. Thank you!!!


live chat support

Cool site. Thank you!!!


live chat support

Cool site. Thank you!!!


live video chat

Good site. Thank you!


live video chat

Good site. Thank you!


online video chat

Good site. Thanks.


el chat mexican

Very good site. Thanks.


chat el salvador

Very good site. Thank you!

chat el salvador

Very good site. Thank you!

online pharmacy valium

Nice site. Thanks:-)

gathering of old men sully

Very good site. Thanks!!!

pharmacy

Cool site. Thank you:-)

pharmacy

Cool site. Thank you:-)

family guy

Good site. Thanks:-)

family guy

Good site. Thanks:-)

radio stations

Nice site. Thank you:-)

radio stations

Nice site. Thank you:-)

college football early lines

Cool site. Thanks!

dogpile

Cool site. Thanks.

dogpile

Cool site. Thanks.

thehun

Nice site. Thank you.

wet pussy

Nice site. Thank you!

three days grace

Nice site. Thanks:-)

three days grace

Nice site. Thanks:-)

spanking

Good site. Thank you.

spanking

Good site. Thank you.

antonella barba

Cool site. Thanks.

antonella barba

Cool site. Thanks.

harry potter book 7

Nice site. Thanks!!!

harry potter book 7

Nice site. Thanks!!!

free raven riley video

Very good site. Thanks!

free raven riley video

Very good site. Thanks!

briana banks

Nice site. Thank you:-)

broadway ticket

Nice site. Thanks:-)

broadway ticket

Nice site. Thanks:-)

hannah montana

Cool site. Thank you!

hannah montana

Cool site. Thank you!

topless tanning

Nice site. Thanks:-)

clit

Very good site. Thank you!!!

clit

Very good site. Thank you!!!

music lyric

Nice site. Thanks:-)

hunter milf

Nice site. Thanks:-)

expanded queen headboards

Very good site. Thank you!

sexy exercise video

Cool site. Thank you:-)

sexy exercise video

Cool site. Thank you:-)

riku kingdom hearts pictures

Very good site. Thanks.

louis purse vuitton wallet

Very good site. Thanks.

figural accent lamps

Nice site. Thanks!!!

afwasautomaten

Good site. Thanks!!!

afwasautomaten

Good site. Thanks!!!

mini storage building

Good site. Thank you!

jãnio quadros

Cool site. Thanks!!!

airforce websites

Good site. Thanks.

airforce websites

Good site. Thanks.

rolex daytona watch replica copy

Cool site. Thanks.

natrol company

Cool site. Thanks:-)

natrol company

Cool site. Thanks:-)

serta perfect night

Good site. Thanks.

serta perfect night

Good site. Thanks.

palm m505 xp

Very good site. Thank you!

annette simmons

Cool site. Thanks.

toy store doha

Good site. Thanks!!!

toy store doha

Good site. Thanks!!!

charleston golf resort

Cool site. Thank you!

2007 acura rsx sedan

Good site. Thank you!

kn air intake kits

Very good site. Thanks!!!

kn air intake kits

Very good site. Thanks!!!

the seven drawfs menopause

Good site. Thanks:-)

the seven drawfs menopause

Good site. Thanks:-)

geico directcom

Good site. Thanks.

geico directcom

Good site. Thanks.

pine meadow knitting news

Good site. Thanks!!!

pine meadow knitting news

Good site. Thanks!!!

of the job market

Very good site. Thanks!!!

of the job market

Very good site. Thanks!!!

fungus characteristics interactive

Cool site. Thanks!!!

fungus characteristics interactive

Cool site. Thanks!!!

antisexy

Given the release frequency of JUnit I'd prefer it if this were added to jMock. That way we don't have to create a new constraint library inside JUnit which might clash with the jMock version. Adding this class to jMock also has the benefit that JBehave could take advantage of it.

studying marine biology

Very good site. Thank you!

studying marine biology

Very good site. Thank you!

97 montero drive cycle

Good site. Thanks!

desinger replica purses

Good site. Thank you.

desinger replica purses

Good site. Thank you.

hotel renaissance seattle washington

Cool site. Thanks:-)

free mercedes benz 290gd 461 repair manual

Nice site. Thanks.

saddle pals therapeutic riding

Good site. Thank you.

saddle pals therapeutic riding

Good site. Thank you.

dj drama gotti yo

Cool site. Thank you!

goki

Very good site. Thank you.

goki

Very good site. Thank you.

aftermarket mufflers

Very good site. Thanks!!!

estate kennebunkport maine real

Cool site. Thanks:-)

estate kennebunkport maine real

Cool site. Thanks:-)

jbl lenses for sale

Very good site. Thanks.

obtaining marriage licenses california

Very good site. Thanks.

obtaining marriage licenses california

Very good site. Thanks.

flight simulator plane

Cool site. Thanks!!!

looking in the mirror at yourself

Good site. Thanks!!!

dryer hair mount wall

Cool site. Thank you.

dryer hair mount wall

Cool site. Thank you.

dinner at the palace hotel in san francisco

Nice site. Thank you!

dinner at the palace hotel in san francisco

Nice site. Thank you!

red burning candles

Very good site. Thank you!!!

red burning candles

Very good site. Thank you!!!

gimp set transparent color

Nice site. Thanks!

gimp set transparent color

Nice site. Thanks!

weight loss diet

Nice site. Thank you!

she

Very good site. Thank you:-)

bed sheet

Cool site. Thanks.

water bed sheet

Nice site. Thanks!

cascading style sheet

Good site. Thank you.

free sheet music

Good site. Thank you!

fax cover sheet

Nice site. Thank you.

coloring sheet

Good site. Thank you.

material safety data sheet

Very good site. Thanks!

free piano sheet music

Nice site. Thank you:-)

pink sheet

Cool site. Thank you!

sheet set

Cool site. Thanks.

balance sheet

Very good site. Thanks.

green sheet

Nice site. Thanks!

cat lantern

Very good site. Thank you.

green bathroom accessories

Cool site. Thanks!!!

time sheet

Cool site. Thank you.

time sheet

Cool site. Thank you.

history of ohio state university

Cool site. Thank you!

aluminum sheet

Good site. Thank you!!!

distance from the sun

Good site. Thank you!

distance from the sun

Good site. Thank you!

egyptian cotton sheet

Very good site. Thanks!

egyptian cotton sheet

Very good site. Thanks!

leprecha

Very good site. Thank you!!!


leprechaun movie

Cool site. Thank you:-)


leprechaun movie

Cool site. Thank you:-)


leprechaun tattoo

Very good site. Thank you:-)


leprechaun image

Good site. Thanks.


leprechaun image

Good site. Thanks.


notre dame leprechaun

Nice site. Thank you!!!


leprechaun joke

Very good site. Thanks.


leprechaun joke

Very good site. Thanks.


st patricks day leprecha

Cool site. Thank you.


st patricks day leprecha

Cool site. Thank you.


leprechaun back 2 the ho

Cool site. Thanks.


leprechaun back 2 the ho

Cool site. Thanks.


leprechaun decoration

Nice site. Thank you!


leprechaun day

Very good site. Thank you:-)


leprechaun day

Very good site. Thank you:-)


sexy leprechaun

Good site. Thanks!!!


sexy leprechaun

Good site. Thanks!!!


6 childs chucky leprecha

Cool site. Thanks!


leprechaun color pages

Good site. Thank you!!!


leprechaun color pages

Good site. Thank you!!!


leprechaun union

Good site. Thank you.


leprechaun union

Good site. Thank you.


tiava com

Cool site. Thank you!


tiava movie

Good site. Thanks!


tiava pic

Cool site. Thanks:-)


tiava links

Nice site. Thank you.


sinbad comedian

Nice site. Thanks.


sinbad comedian

Nice site. Thanks.


popeye meet sinbad sailo

Good site. Thank you.


popeye meet sinbad sailo

Good site. Thank you.


sinbad the comedian acto

Cool site. Thank you!


sinbad afros bell bottom

Cool site. Thank you!!!


son of sinbad

Very good site. Thanks:-)


son of sinbad

Very good site. Thanks:-)


sinbad jr

Very good site. Thanks.


gottlieb sinbad

Very good site. Thank you:-)


gottlieb sinbad

Very good site. Thank you:-)


sinbad series

Good site. Thanks!


sinbad series

Good site. Thanks!


sinbad ticket

Good site. Thank you.

playback

Very good site. Thanks!

chicony

Nice site. Thanks!

chicony

Nice site. Thanks!

north dakota lease

Cool site. Thanks:-)

north dakota lease

Cool site. Thanks:-)

bootleg movie download

Nice site. Thanks:-)

live bootleg

Nice site. Thanks!

free bootleg movie

Nice site. Thanks:-)

bootleg dvd

Very good site. Thanks!!!

britney spears wallpaper

Very good site. Thanks.


britney spears wallpaper

Very good site. Thanks.


britney spears music vid

Good site. Thank you!


wet pussy

Very good site. Thank you!

wet pussy

Very good site. Thank you!

teen pussy

Very good site. Thanks:-)

teen pussy

Very good site. Thanks:-)

britney spears pussy

Very good site. Thanks!

britney spears pussy

Very good site. Thanks!

hentai manga

Very good site. Thank you!!!


hentai manga

Very good site. Thank you!!!


hentai movie

Cool site. Thank you!


hentai ville

Very good site. Thank you:-)


hentai ville

Very good site. Thank you:-)


hentai xxx

Cool site. Thank you.


dragonball hentai

Cool site. Thank you:-)


hentai sonic

Cool site. Thank you:-)


hentai sonic

Cool site. Thank you:-)


cell phone repeater antennas

Very good site. Thank you.

used cars honda civic si

Nice site. Thank you!!!

download free hentai

Good site. Thank you!!!


奥林 巴斯 c 3030 驱动 下载

Good site. Thank you:-)

hentai zelda

Very good site. Thanks!


cosplay hentai

Nice site. Thank you!!!


matrix revolutions posters

Very good site. Thanks.

default password hp switch

Cool site. Thank you!

parfüm

Very good site. Thank you.

parfüm

Very good site. Thank you.

mures

Good site. Thanks!

mures

Good site. Thanks!

truckmounts

Very good site. Thank you!

c 45

Very good site. Thank you.

1150c

Cool site. Thanks:-)

horizontal utility shed

Good site. Thank you!!!

horizontal utility shed

Good site. Thank you!!!

2007 award grammy winner

Nice site. Thank you.


2007 award grammy winner

Nice site. Thank you.


road salt kill grass

Good site. Thank you!

new york personal injury

Nice site. Thanks.

watch