Below some of my experiences.
JUnit has "rules" which allow lowering the amount of the boilerplate code. For instance, a rule can start a servlet container before the test and stop it after, create and inject a Selenium instance and so on. This makes tests much more elegant.
TestNG has support for groups (and their dependencies). This is extremely useful for integration testing - for instance you can turn of certain groups in certain environments. JUnit 4.8 introduces "categories" which may be something similar.
Spring Test has a very nice approach with "test execution listeners" which can "prepare" your test instances. This is somewhat similar to JUnit rules. Spring Test is also test framework-agnostig, that is, your tests will almost look the same on JUnit or TestNG. There's also "profiles" which are similar to TestNG groups.
Here's a sample of Selenium-tested JSF application, TestNG-based. Also take a look at my Hifaces20 Testing package, maybe you'll find some ideas useful.