JUnit-拡張機能

以下はJUnit拡張機能です-

  • Cactus
  • JWebUnit
  • XMLUnit
  • MockObject

カクタス

Cactusは、サーバー側のJavaコード(サーブレット、EJB、タグライブラリ、フィルター)を単体テストするためのシンプルなテストフレームワークです。Cactusの目的は、サーバー側コードのテストを作成するコストを削減することです。JUnitを使用して拡張します。Cactusは、コンテナー内でテストを実行するコンテナー内戦略を実装します。

サボテンの生態系はいくつかの要素で構成されています-

  • Cactus Frameworkサボテンの心臓部です。これは、Cactusテストを作成するためのAPIを提供するエンジンです。

  • Cactus Integration Modules Cactus Framework(Antスクリプト、Eclipseプラグイン、およびMavenプラグイン)を簡単に使用する方法を提供するフロントエンドおよびフレームワークです。

次のコードは、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は、Webアプリケーション用のJavaベースのテストフレームワークです。HtmlUnitやSeleniumなどの既存のテストフレームワークを統合されたシンプルなテストインターフェイスでラップして、Webアプリケーションの正確性をテストします。

JWebUnitは、一連のアサーションと組み合わせてWebアプリケーションをナビゲートするための高レベルのJava APIを提供し、アプリケーションの正当性を検証します。これには、リンクを介したナビゲーション、フォームの入力と送信、テーブルコンテンツの検証、およびその他の一般的なビジネスWebアプリケーション機能が含まれます。

シンプルなナビゲーションメソッドとすぐに使用できるアサーションにより、JUnitまたはHtmlUnitのみを使用するよりも迅速なテスト作成が可能になります。また、HtmlUnitからSelenium(まもなく利用可能)などの他のプラグインに切り替えたい場合は、テストを書き直す必要はありません。

これがサンプルコードです。

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は、単一のJUnit拡張クラスであるXMLTestCaseと、アサーションを実行できるようにする一連のサポートクラスを提供します。

  • 2つのXMLの違い(DiffクラスとDetailedDiffクラスを介して)。

  • XMLの一部の有効性(Validatorクラスを介して)。

  • XSLTを使用して(Transformクラスを介して)XMLの一部を変換した結果。

  • XMLの一部でのXPath式の評価(XpathEngineインターフェイスを実装するクラスを介して)。

  • (NodeTestクラスを介して)DOMトラバーサルによって公開されるXMLの一部の個々のノード。

比較したいXMLが2つあり、それらが等しいと主張するとします。このような簡単なテストクラスを書くことができます-

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

単体テストでは、モックオブジェクトは複雑な実際の(非モック)オブジェクトの動作をシミュレートできるため、実際のオブジェクトを単体テストに組み込むことが実用的でないか不可能な場合に役立ちます。

モックオブジェクトでテストするための一般的なコーディングスタイルは次のとおりです。

  • モックオブジェクトのインスタンスを作成します。
  • モックオブジェクトに状態と期待値を設定します。
  • パラメータとしてモックオブジェクトを使用してドメインコードを呼び出します。
  • モックオブジェクトの整合性を確認します。

以下に、Jmockを使用したMockObjectの例を示します。

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();
   }
}