JUnit - Estensioni
Di seguito sono riportate le estensioni JUnit:
- Cactus
- JWebUnit
- XMLUnit
- MockObject
Cactus
Cactus è un semplice framework di test per il codice java lato server di unit testing (servlet, EJB, tag lib, filtri). L'intento di Cactus è quello di ridurre il costo di scrittura dei test per il codice lato server. Usa JUnit e lo estende. Cactus implementa una strategia in-container che esegue i test all'interno di un container.
L'ecosistema di cactus è composto da diversi componenti:
Cactus Frameworkè il cuore di Cactus. È il motore che fornisce l'API per scrivere i test Cactus.
Cactus Integration Modules sono front-end e framework che forniscono modi semplici per utilizzare Cactus Framework (script Ant, plugin Eclipse e plugin Maven).
Il codice seguente mostra come utilizzare Cactus.
import org.apache.cactus.*;
import junit.framework.*;
public class TestSampleServlet extends ServletTestCase {
@Test
public void testServlet() {
// Initialize class to test
SampleServlet servlet = new SampleServlet();
// Set a variable in session as the doSomething()
// method that we are testing
session.setAttribute("name", "value");
// Call the method to test, passing an
// HttpServletRequest object (for example)
String result = servlet.doSomething(request);
// Perform verification that test was successful
assertEquals("something", result);
assertEquals("otherValue", session.getAttribute("otherName"));
}
}
JWebUnit
JWebUnit è un framework di test basato su Java per applicazioni web. Avvolge framework di test esistenti come HtmlUnit e Selenium con un'interfaccia di test unificata e semplice per testare la correttezza delle tue applicazioni web.
JWebUnit fornisce un'API Java di alto livello per la navigazione in un'applicazione web combinata con una serie di asserzioni per verificare la correttezza dell'applicazione. Ciò include la navigazione tramite collegamenti, l'immissione e l'invio di moduli, la convalida del contenuto della tabella e altre funzionalità tipiche dell'applicazione Web aziendale.
I semplici metodi di navigazione e le asserzioni pronte all'uso consentono una creazione di test più rapida rispetto all'utilizzo solo di JUnit o HtmlUnit. E se vuoi passare da HtmlUnit ad altri plugin come Selenium (presto disponibile), non c'è bisogno di riscrivere i tuoi test.
Ecco un codice di esempio.
import junit.framework.TestCase;
import net.sourceforge.jwebunit.WebTester;
public class ExampleWebTestCase extends TestCase {
private WebTester tester;
public ExampleWebTestCase(String name) {
super(name);
tester = new WebTester();
}
//set base url
public void setUp() throws Exception {
getTestContext().setBaseUrl("http://myserver:8080/myapp");
}
// test base info
@Test
public void testInfoPage() {
beginAt("/info.html");
}
}
XMLUnit
XMLUnit fornisce una singola classe di estensione JUnit, XMLTestCase e un insieme di classi di supporto che consentono di fare asserzioni su:
Le differenze tra due parti di XML (tramite le classi Diff e DetailedDiff).
La validità di un pezzo di XML (tramite la classe Validator).
Il risultato della trasformazione di un pezzo di XML utilizzando XSLT (tramite la classe Transform).
La valutazione di un'espressione XPath su un pezzo di XML (tramite classi che implementano l'interfaccia XpathEngine).
Singoli nodi in un pezzo di XML che vengono esposti da DOM Traversal (tramite la classe NodeTest).
Supponiamo di avere due parti di XML che desideriamo confrontare e affermare che sono uguali. Potremmo scrivere una semplice classe di test come questa -
import org.custommonkey.xmlunit.XMLTestCase;
public class MyXMLTestCase extends XMLTestCase {
// this test method compare two pieces of the XML
@Test
public void testForXMLEquality() throws Exception {
String myControlXML = "<msg><uuid>0x00435A8C</uuid></msg>";
String myTestXML = "<msg><localId>2376</localId></msg>";
assertXMLEqual("Comparing test xml to control xml", myControlXML, myTestXML);
}
}
MockObject
In uno unit test, gli oggetti fittizi possono simulare il comportamento di oggetti complessi, reali (non fittizi) e sono quindi utili quando un oggetto reale è poco pratico o impossibile da incorporare in uno unit test.
Lo stile di codifica comune per i test con oggetti fittizi è:
- Crea istanze di oggetti fittizi.
- Imposta lo stato e le aspettative negli oggetti fittizi.
- Richiama il codice di dominio con oggetti fittizi come parametri.
- Verifica la coerenza negli oggetti fittizi.
Di seguito è riportato un esempio di MockObject che utilizza Jmock.
import org.jmock.Mockery;
import org.jmock.Expectations;
class PubTest extends TestCase {
Mockery context = new Mockery();
public void testSubReceivesMessage() {
// set up
final Sub sub = context.mock(Sub.class);
Pub pub = new Pub();
pub.add(sub);
final String message = "message";
// expectations
context.checking(new Expectations() {
oneOf (sub).receive(message);
});
// execute
pub.publish(message);
// verify
context.assertIsSatisfied();
}
}