Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you unit test Java EE code?

I want to ask for your prefered way to test Java EE code?

I found only three project, that are trying to help to code unit tests in Java EE environment:

  • http://jakarta.apache.org/cactus/ : Last Published: 2009-01-18
  • http://www.junitee.org/ : Last Release: 2004-12-11
  • http://ejb3unit.sourceforge.net/ : Last Release: 2008-05-17

So I wonder,

  • is there any framework helping to write (j) unit test for Java EE code?
  • do you use embedded Java EE servers like jboss or glassfish v3?
  • do you mockup and inject by yourself?

Thanks a lot...

like image 256
marabol Avatar asked Dec 22 '09 17:12

marabol


People also ask

How do you perform a unit test in Java?

To perform unit testing, we need to create test cases. The unit test case is a code which ensures that the program logic works as expected. The org. junit package contains many interfaces and classes for junit testing such as Assert, Test, Before, After etc.

How do you write JUnit test cases for model classes in Java?

@RunWith(MockitoJUnitRunner. class) public class MyClassTest{ @InjectMocks MyClass myClass; @Mock MyDAO myDAO; private MyObject myObj; private List<MyObject> objList; @Before public void setUp() throws Exception { myObj = new MyObject(); myObj.


3 Answers

If by Unit Testing you mean... unit testing (testing a unit in isolation), then you actually don't need any particular framework since EJB3.0 are nothing more than annotated POJOs and thus can be relatively easily tested without any special fixture.

Now, if you mean something else - like Integration Testing or Functional Testing - then, yes, tools can help and simplify things (but you should really start to use the right terminology :) I'll assume that this is what you have in mind.

First, JUnitEE seems dead and obsolete and I'm not even sure it has anything for EJB3.x. Second, I'm not impressed by the Java EE 5 support of Cactus and having to deploy Cactus tests is painful (I think that Cactus was nice for J2EE 1.4 but is a bit outdated now). So this leaves us with Ejb3Unit which is in my opinion the best option, especially if you want to run out of container tests i.e. without really deploying the application (much faster).

If you want to run in container tests, then you could indeed use an embedded container and my current preference goes to GlassFish v3, even for Java EE 5 (I may be wrong but I'm pretty disappointed by the starting time of the latest JBoss releases so it isn't getting much of my attention). See the post GlassFish Embedded Reloaded, an appserver in your pocket for sample code (that you could use from your tests) or Using maven plugin for v3 embedded glassfish (if you are using maven).

Another option would be to package and deploy your application with Cargo and then run some tests against the deployed application (with Selenium or a BDD tool for example). This could be useful if you want to run end-to-end tests with a container that doesn't provide any embedded API.

So, to answer your last question, I would indeed use available tools, maybe a combination of them, for tests that are not unit tests and wouldn't mock/inject stuff myself, except if they don't cover some needs that I can't think of right now.

like image 64
Pascal Thivent Avatar answered Sep 20 '22 02:09

Pascal Thivent


As you are interested in unit testing, I recommend JUnit. You can unit test the methods in the core classes. If you have difficulty in writing unit test cases using JUnit, then probably the design is not modular and it is highly coupled. First focus on your core functionality and test it using JUnit.

like image 21
Sundar Avatar answered Sep 23 '22 02:09

Sundar


I've been facing the same problem of running integration tests based on JUnit in a Java EE 6 container (Glassfish v3, to be precise), and after a lot of browsing and searching, I could not find a solution that really suited me needs, so I wrote my own, now published as jeeunit on Google Code.

I wouldn't call it a test framework, it is really just a handful of classes providing the glue between JUnit and Embedded Glassfish.

The general idea is similar to Cactus, your tests run in the container and get triggered by a servlet from outside.

jeeunit supports JUnit 4, Glassfish v3, CDI and generates the standard XML JUnit reports just like Ant or Maven Surefire (in fact, I reused some code from Ant for generating the reports).

like image 32
Harald Wellmann Avatar answered Sep 23 '22 02:09

Harald Wellmann