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

Gwt 如何绑定Jukito模块中的命名提供程序?,gwt,junit,guice,gwtp,jukito,Gwt,Junit,Guice,Gwtp,Jukito,我正在使用测试GWTP演示者,似乎无法使命名绑定正常工作 我希望能够测试登录小部件的onReveal(),因此我需要提供一份已登录和未登录的CurrentUserDto副本。这就是我想做的: @RunWith(JukitoRunner.class) public class LoginWidgetPresenterTest { public static class Module extends JukitoModule { @Override p

我正在使用测试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());

    }

}
@RunWith(JukitoRunner.class)
公共类LoginWidgetPresenterTest
{
公共静态类模块扩展了JUKITOMODEL
{
@凌驾
受保护的无效配置测试()
{
bind(CurrentUserDto.class).annotatedWith(Names.named(“loggedIn”)).toProvider(LoggedInUserProvider.class);
bind(CurrentUserDto.class).annotatedWith(Names.named(“loggedOut”)).toProvider(LoggedOutUserProvider.class);
//这些也不起作用:
//bindNamed(CurrentUserDto.class,“loggedIn”).toProvider(LoggedInUserProvider.class);
//bindNamed(CurrentUserDto.class,“loggedOut”).toProvider(LoggedOutUserProvider.class);
}
公共静态类LoggedInUserProvider实现提供程序
{
@凌驾
public currentUserdToGet()
{
CurrentUserDto currentUser=new CurrentUserDto(true,100L);//isLoggedIn,userId
currentUser.setEmail(“john@example.com");
currentUser.set昵称(“john”);
currentUser.setLogoutUrl(“注销”);
返回当前用户;
}
}
公共静态类LoggedOutUserProvider实现提供程序
{
@凌驾
public currentUserdToGet()
{
CurrentUserDto currentUser=new CurrentUserDto(false,null);//isLoggedIn,userId
返回当前用户;
}
}
}
@注入
LoginWidgetPresenter演示者;
@试验
public void testLoggedInUser(LoginWidgetPresenter.MyView MyView,@Named(“loggedIn”)CurrentUserDto currentUser)
{
//什么时候
onReveal();
//然后
验证(myView).displayEmail(currentUser.getEmail());
验证(myView).displayLogoutLink(currentUser.getLogoutUrl());
}
@试验
public void testLoggedOutUser(LoginWidgetPresenter.MyView MyView,@Named(“loggedOut”)CurrentUserDto currentUser)
{
//什么时候
onReveal();
//然后
验证(myView,never()).displayEmail(currentUser.getEmail());
验证(myView,never()).displayLogoutLink(currentUser.getLogoutUrl());
}
}
我怀疑这可能和作用域有关,但我对依赖注入还不太熟悉,所以我仍然在想这个问题


当我只有一个提供者时,它工作得很好,现在我使用
命名的
CurrentUserDto
LoginWidgetPresenter
中的
CurrentUserDto
对象总是空的

我假设
LoginWidgetPresenter
有一个空的
CurrentUserDto
注入。测试方法的参数不会更改
LoginWidgetPresenter
的依赖项。要处理此问题,您可以有两个不同的模块,每个模块都将
CurrentUserDto
绑定到不同的
提供程序

以下模块应该可以工作,因为Jukito支持@Provides:

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
,由一个更复杂的GUI提供程序注入(类似于此:)-它检查用户是否登录到appengine userservice,并返回登录用户的信息,或者返回没有用户登录的信息。我认为在
JukitoModule
中绑定另一个
提供程序会将该实例注入测试中的
LoginWidgetPresenter
。“我认为在JukitoModule中绑定另一个提供程序会将该实例注入测试中的LoginWidgetPresenter。”它会,但
@Named(“loggedIn”)CurrentUserDto
与bare
CurrentUserDto
只是一个不同的依赖项。对不起,我现在明白你所说的“bare”是什么意思了-没有用
@Named
注释(doh!)。我想我明白了,那么有没有办法在同一个测试用例中使用
CurrentUserDto
的两个单独实例来测试
onReveal()
方法?我不能只做
currentUser.setIsLoggedIn(false)
因为注入演示者的实例仍然设置为登录。我选择了这个作为正确答案,因为它帮助我意识到,我的
JukitoModule
中的
@命名的
绑定不会将该实例注入到
LoginWidgerPresenter
中,除非它也以相同的方式进行注释。对象仍然是使用@Provides时为空?啊,我现在知道了。我不能对另一个答案发表评论,但您的问题确实是注入LoginWidgetPresenter的CurrentUserDto与您的测试中的不一样。您需要将CurrentUserDto(或您的提供者)绑定到TestSingleton范围谢谢!一旦我设置了作用域,这意味着我可以注入登录的方法,调用
setIsLoggedIn(false)
,然后验证这些方法是否从未被调用过。干杯