2016-06-17 34 views
0

,並試圖單元測試是在我的要求,這是與下面的消息沒有設置頁眉創造PlayFramework測試環境:不使用我使用PlayFramework 2.5嘲笑

Test controllers.ApplicationTest.knownUnregister failed: java.lang.RuntimeException: There is no HTTP Context available from here. 

我的測試類是:

package controllers; 

import java.util.Optional; 

import org.junit.Test; 
import play.mvc.Http; 
import play.mvc.Result; 

import static org.hamcrest.Matchers.*; 
import static org.junit.Assert.*; 

public class MyAppTest { 
    @Test public void knownUnregister() { 
    MyApp app = new MyApp(); 
    Result res = app.registerEnv(); 
    Optional<String> url = res.header(Http.HeaderNames.LOCATION); 
    assertTrue(url.isPresent()); 
    } 
} 

的來源是:

package controllers; 

import play.mvc.Controller; 
import play.mvc.Result; 
import play.mvc.Http; 

public class MyApp extends Controller { 
    public Result registerEnv() { 
     response().setHeader(Http.HeaderNames.LOCATION, "/env/foo"); 
     return created("foo"); 
    } 
} 

我看到Play framework 2.2.1: Create Http.Context for tests,它嘲笑RequestHeader對象。這樣做會導致測試失敗並出現空指針異常,可能是因爲模擬對象爲標題映射返回空映射。

看着Mockito文檔,在我想清楚如何正確設置模擬之前,我看到了文檔中不會模擬不屬於您的代碼的部分,並且如果代碼關心模擬返回的內容,那麼測試可能存在問題。

因爲我關心真正的結果,並設置了正確的標題,所以它看起來像創造一個真實的,而不是嘲弄的,上下文就是我想在這裏做的。

有沒有辦法做到這一點?

+0

沒有模擬的唯一方法是有一個集成測試,而不是單元測試。 – marcospereira

回答

0

要編寫單元測試,您應該從WithApplication派生您的測試類,並使用Helpers類(Play)調用控制器方法。它應該是你的情況是這樣的:

public class MyTest extends WithApplication { 
    @Test 
    public void testSomething() { 
     Helpers.running(Helpers.fakeApplication(),() -> { 
      Call action = controllers.routes.MyApp.registerEnv(); 
      Result res = route(Helpers.fakeRequest(action)); 
      Optional<String> url = res.header(Http.HeaderNames.LOCATION); 
      assertTrue(url.isPresent()); 
     }); 
    } 
} 

你可以找到更多的例子在我的博客here