2016-08-29 10 views
1

これは私のクラスとそのコンストラクタと依存関係です。コントローラテストに依存関係を挿入するにはどうすればよいですか?

public class FavouriteProfilesController extends BaseController implements CurrentUser, JsonHelper { 

    private final UserProvider userProvider; 
    private MessagesApi msg; 

    @javax.inject.Inject 
    public FavouriteProfilesController(
      UserProvider userProvider, 
      MessagesApi msgApi) { 
     this.userProvider = userProvider; 
     this.msg = msgApi; 
    } 
    // methods etc... 

これは私がちょうどドキュメントからコピーしたテストコードです:

public class FavouriteProfilesControllerTest extends WithApplication { 

    @Override 
    protected Application provideApplication() { 
     return new GuiceApplicationBuilder() 
       .configure("play.http.router", "javaguide.tests.Routes") 
       .build(); 
    } 

    @Test 
    public void testIndex() { 
     Result result = new FavouriteProfilesController().index(); // Inject dependencies here 
     assertEquals(OK, result.status()); 
     assertEquals("text/html", result.contentType().get()); 
     assertEquals("utf-8", result.charset().get()); 
     assertTrue(contentAsString(result).contains("Welcome")); 
    } 


} 

コントローラは2つの依存関係、UserProviderとMessagesApiを持って、どのように私は、コントローラのテストにそれらをあざけり/注入していますか?

答えて

1

あなたはMockitoを使用する場合は、このようにそれらを模擬することができます

@RunWith(MockitoJUnitRunner.class) 
public class FavouriteProfilesControllerTest extends WithApplication { 

    @InjectMocks 
    private FavouriteProfilesController controller; 

    @Mock 
    private UserProvider userProvider; 

    @Mock 
    private MessagesApi msg; 

    @Test 
    public void test() { 
    Assert.assertNotNull(userProvider); 
    Assert.asserNotNull(msg); 
    } 
} 
+0

優秀、ありがとう! –

1

ソリューションをテストするつもりかに依存します。 UserProviderとMessageApiの動作全体を模擬することを意味するならば、Mockitoを使うのが適切な解決策かもしれません。 実際のオブジェクトでコントローラ機能をテストする場合は、実際のオブジェクトを注入する必要があります。これは次のように行うことができる:あなたのテストのための結合異なる注入を使用することを意味するものではありません場合は

GuiceApplicationBuilderの使用
public class FavouriteProfilesControllerTest extends WithApplication { 
    @Test 
    public void testIndex() { 
     running(Helpers.fakeApplication(),() -> { 
      RequestBuilder mockActionRequest = Helpers.fakeRequest(
       controllers.routes.FavouriteProfilesController.index()); 
      Result result = Helpers.route(mockActionRequest); 
      assertEquals(OK, result.status()); 
      assertEquals("text/html", result.contentType().get()); 
      assertEquals("utf-8", result.charset().get()); 
      assertTrue(contentAsString(result).contains("Welcome")); 
     }); 
    } 
} 

は、必要ありません。 Helpers.fakeApplication()を呼び出すと、デフォルトの依存関係注入が呼び出されます。

ユニットテストの詳細については、Play hereを参照してください。

+0

ありがとう、私は家でそれを試してみるでしょう。 –

関連する問題