2016-08-29 1 views
1

Ceci est ma classe et son constructeur et les dépendances.Comment injecter des dépendances dans les tests du contrôleur?

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... 

C'est le code de test que je viens de copier des documents:

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


} 

Le contrôleur dispose de 2 dépendances, UserProvider et MessagesApi, comment puis-je les réinjecter/fantaisie dans le test du contrôleur?

Répondre

1

Si vous utilisez Mockito, vous pouvez les railler comme ceci:

@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

Excellent, merci! –

1

La solution dépend de ce que vous avez l'intention de tester. Si vous voulez vous moquer de tout le comportement de UserProvider et de MessageApi, utiliser Mockito peut être une bonne solution. Si vous souhaitez tester la fonctionnalité du contrôleur avec des objets réels, vous devez injecter des objets réels. Cela peut être fait comme ceci:

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

L'utilisation de GuiceApplicationBuilder n'est pas nécessaire, si vous ne voulez pas utiliser l'injection différente de liaison pour votre test. Appel à Helpers.fakeApplication() invoque l'injection de dépendance par défaut.

Vous trouverez plus d'informations sur les tests unitaires dans le jeu here.

+0

Merci, je vais essayer ça à la maison. –