Re: ClassRules

David Saff <[email protected]> Fri, 23 Oct 2009 09:25:16 -0400
Newsgroups gmane.comp.java.junit.devel
Message-ID <[email protected]>
Alistair,

I think class-level rules make a lot of sense.  Do you think re-using
the @Rule annotation is better than a new @ClassRule annotation?

   David

On Mon, Oct 19, 2009 at 6:05 AM, Alistair Israel <[email protected]> wrote:
> Hi, list.
>
> Hope I'm not overstepping by just barging in like this. Anyway, I'm
> one of those early adopters of JUnit 4.7's new @Rules.
>
> As I use them more and more I've also been seeing the usefulness of
> class-level rules more and more.
>
> A concrete use case of mine is initializing a JPA (Hibernate)
> persistence context backed by an embedded Derby database, then using
> DbUnit to load fixtures and populate the database.
>
> Using JUnit 4.7, I'm able to accomplish the above using a single
> MethodRule that does everything for every test method. The performance
> drawback should be obvious=97we need to initialize Derby DB, set up
> Hibernate JPA, scan for annotated classes and create the tables to
> match the entities for _every test method_.
>
> I've taken the liberty of forking, branching, and committing some
> changes to JUnit that allow for class-level rules. It's up on GitHub,
> and the meat of the changes are here:
> =A0http://github.com/AlistairIsrael/junit/commit/79ef5a7e1d7fa144cc81c941=
4f4791aaea8b3d75
>
> The gist of it:
> =A0* Created the ClassRule interface that declares the apply(Statement,
> TestClass) method.
> =A0* Modified ParentRunner to scan for fields that are a) annotated
> with @Rule, b) static, and c) implement ClassRule.
> =A0* If any are found, then apply them in the order found, allowing
> them to append to the head of the Statement chain.
> =A0* Modified BlockJUnit4ClassRunner so validation treats ClassRules
> appropriately, and only apply MethodRules in methodBlock()
>
> I've also added a ClassRulesTest to AllTests to verify the above.
>
> Using a local-build, I successfully refactored my specific use-case
> and split the compound rule into a separate ClassRule (set up Derby
> and Hibernate) and a MethodRule (load DbUnit fixtures). Not only are
> the resulting tests more efficient, this strategy lets each Rule to be
> used independently, even allows for mixing and matching of different
> database, JPA or fixtures providers.
>
> I have a few more ideas on where this can go, but I'd like to get some
> feedback first if this is something that's welcome or if you guys have
> another direction you think we should take.
>
> Thanks,
> - alistair
> --
> http://alistairisrael.wordpress.com
>
> -------------------------------------------------------------------------=
-----
> Come build with us! The BlackBerry(R) Developer Conference in SF, CA
> is the only developer event you need to attend this year. Jumpstart your
> developing skills, take BlackBerry mobile applications to market and stay
> ahead of the curve. Join us from November 9 - 12, 2009. Register now!
> http://p.sf.net/sfu/devconference
> _______________________________________________
> Junit-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/junit-devel
>

---------------------------------------------------------------------------=
---
Come build with us! The BlackBerry(R) Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay =

ahead of the curve. Join us from November 9 - 12, 2009. Register now!
http://p.sf.net/sfu/devconference