如何在Jukito模块中绑定命名的提供程序



我正在使用Jukito测试GWTP演示器,并且似乎无法使命名绑定工作。

我希望能够测试我的登录小部件的onReveal(),所以我需要提供一个登录的CurrentUserDto的副本,一个不是。这就是我要做的:

@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());
        
    }
    
}

我怀疑这可能与作用域有关,但我是依赖注入的新手,所以仍然在思考它。

当我只有一个提供程序时,它工作得很好,现在我使用@Named, LoginWidgetPresenter中的CurrentUserDto对象始终为空

以下应该可以工作,因为Jukito支持@ providers:

public static class Module extends JukitoModule
{
        @Override
        protected void configureTest()
        {
        }
        @Provides
        @Named("loggedIn")
        CurrentUserDto getLoggedInDto()
        {
            CurrentUserDto currentUser = new CurrentUserDto(true, 100L); // isLoggedIn, userId
            currentUser.setEmail("john@example.com");
            currentUser.setNickname("john");
            currentUser.setLogoutUrl("#logout");
            return currentUser;
        }
        @Provides
        @Named("loggedOut")
        CurrentUserDto getLoggedOutDto()
        {
            CurrentUserDto currentUser = new CurrentUserDto(false, null); // isLoggedIn, userId
            return currentUser;
        }
}

我假设LoginWidgetPresenter有一个裸CurrentUserDto注入。测试方法的参数不会改变LoginWidgetPresenter的依赖关系。为了处理这个问题,可以使用两个不同的模块,每个模块将CurrentUserDto绑定到不同的Provider

相关内容

  • 没有找到相关文章

最新更新