使用模拟单元测试Play控制器

Sam*_*amo 8 junit controller mocking playframework playframework-2.0

标题基本概括了所有内容.我想建立一个传统的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));
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

这里显而易见的问题是我在测试中实例化我的类并从测试方法本身注入模拟依赖项,当我应该在setup()方法中执行此操作时.setup()如果我要以传统的方式测试我的控制器,那么该方法似乎毫无用处.

当然,我可以按照Play推荐的方式测试控制器,但我的应用程序依赖于外部SOAP Web服务,因此我需要单元测试来显示我们的代码在服务器关闭时正常工作.

那么,什么是使用模拟单元测试Play控制器同时仍然利用setup()teardown()方法的最佳方法?

编辑

我意识到我在这里假设一些知识,所以对于那些不知道的人,单元测试中的控制器实例化必须包含在running()函数或Play中!将抛出运行时异常,表示尚未启动任何应用程序.

Zap*_*dot 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);
  }
Run Code Online (Sandbox Code Playgroud)