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