8

タイトルはほとんどそれをすべて言います。従来のJUnitテストをセットアップして、コントローラーの依存関係をモックし、アクションに対してテストを実行したいと思います。

私はこのように私の目標を達成できることがわかりました:

public class AccountsControllerTest {
    private controllers.Accounts accountsController;

    @Test
    public void test() {
        running(fakeApplication(), new Runnable() {
            public void run() {
                accountsController = new controllers.Accounts();
                accountsController.setAccountsWorkflow(mock(workflow.Accounts.class));
            }
        });
    }
}

ここでの明らかな問題は、テスト対象のクラスをインスタンス化し、メソッドでそれを行う必要があるときに、テストメソッド自体からモック依存関係を注入していることsetup()です。従来の方法でコントローラーをテストする場合、このsetup()方法は役に立たないようです。

もちろん、Playが推奨する方法でコントローラーをテストできますが、アプリケーションは外部のSOAP Webサービスに依存しているため、サーバーがダウンしているときにコードが機能していることを示す単体テストが必要です。

では、モックを使用してPlayコントローラーの単体テストを行いながらsetup()teardown()メソッドを利用するための最良の方法は何でしょうか。

編集

ここではある程度の知識があることを前提としているので、知らない人のために、単体テストでのコントローラーのインスタンス化はrunning()関数またはPlayでラップする必要があります。アプリケーションが開始されていないことを示すランタイム例外をスローします。

4

1 に答える 1

1

これは、MockitoとPlayのFakeApplicationを使用し、静的Http.Context変数を設定することで実現できます。

このようにして、他のすべてのJUnitテストと同じようにテストを記述できます。

例:

...
import static play.test.Helpers.status;
import play.test.FakeApplication;
import play.test.Helpers;
import play.mvc.Http;
import play.mvc.Result;
...

@RunWith(MockitoJUnitRunner.class)
public class ApplicationTest {

  public static FakeApplication app;

  @Mock
  private Http.Request request;

  @BeforeClass
  public static void startApp() {
      app = Helpers.fakeApplication();
      Helpers.start(app);

  }

  @Before
  public void setUp() throws Exception {
      Map<String, String> flashData = Collections.emptyMap();
      Http.Context context = new Http.Context(request, flashData, flashData);
      Http.Context.current.set(context);
  }

  @Test
  public void testIndex() {
      final Result result = Application.index();
      assertEquals(play.mvc.Http.Status.OK, status(result));
  }

  @AfterClass
  public static void stopApp() {
      Helpers.stop(app);
  }
于 2012-09-19T14:02:38.917 に答える