junitgwtguicegwt-platformjukito

How do I bind named providers in a Jukito module?


I am testing a GWTP presenter using Jukito, and can't seem to get named bindings to work.

I want to be able to test the onReveal() of my login widget, so I need to provide a copy of my CurrentUserDto that is logged in, and one that isn't. This is what I'm trying to do:

@RunWith(JukitoRunner.class)
public class LoginWidgetPresenterTest
{
    public static class Module extends JukitoModule
    {
        @Override
        protected void configureTest()
        {
            bind(CurrentUserDto.class).annotatedWith(Names.named("loggedIn")).toProvider(LoggedInUserProvider.class);
            bind(CurrentUserDto.class).annotatedWith(Names.named("loggedOut")).toProvider(LoggedOutUserProvider.class);
            
            // these don't work either:
            // bindNamed(CurrentUserDto.class, "loggedIn").toProvider(LoggedInUserProvider.class);
            // bindNamed(CurrentUserDto.class, "loggedOut").toProvider(LoggedOutUserProvider.class);
        }
        
        public static class LoggedInUserProvider implements Provider<CurrentUserDto>
        {
            @Override
            public CurrentUserDto get()
            {
                CurrentUserDto currentUser = new CurrentUserDto(true, 100L); // isLoggedIn, userId
                currentUser.setEmail("john@example.com");
                currentUser.setNickname("john");
                currentUser.setLogoutUrl("#logout");
                
                return currentUser;
            }
        }
        
        public static class LoggedOutUserProvider implements Provider<CurrentUserDto>
        {
            @Override
            public CurrentUserDto get()
            {
                CurrentUserDto currentUser = new CurrentUserDto(false, null); // isLoggedIn, userId
                
                return currentUser;
            }
        }
        
    }
    
    @Inject
    LoginWidgetPresenter presenter;
    
    @Test
    public void testLoggedInUser(LoginWidgetPresenter.MyView myView, @Named("loggedIn") CurrentUserDto currentUser)
    {
        // when
        presenter.onReveal();
        
        // then
        verify(myView).displayEmail(currentUser.getEmail());
        verify(myView).displayLogoutLink(currentUser.getLogoutUrl());
        
    }
    
    @Test
    public void testLoggedOutUser(LoginWidgetPresenter.MyView myView, @Named("loggedOut") CurrentUserDto currentUser)
    {
        // when
        presenter.onReveal();
        
        // then
        verify(myView, never()).displayEmail(currentUser.getEmail());
        verify(myView, never()).displayLogoutLink(currentUser.getLogoutUrl());
        
    }
    
}

I suspect it may be to do with the scopes, but I'm new to dependency injection so still getting my head around it.

When I only had one provider it worked fine, now I am using @Named the CurrentUserDto objects in the LoginWidgetPresenter are always null.


Solution

  • I assume LoginWidgetPresenter has a bare CurrentUserDto injected. The parameter to your test method doesn't change the dependencies of the LoginWidgetPresenter. To handle this, you could have two different modules, each binding CurrentUserDto to a different Provider.