Java 为什么GoogleGuice不能初始化i18n对象并给我空值

Java 为什么GoogleGuice不能初始化i18n对象并给我空值,java,guice,Java,Guice,我正在为我的方法编写一个J单元测试用例 A.java void resetToolbar(final ListSelectionModel lastSelectionModel) { // attempt to restore the previous page if (toolbar != null && lastSelectionModel != null) { gridPanel.setSelectionModel(

我正在为我的方法编写一个J单元测试用例

A.java

 void resetToolbar(final ListSelectionModel lastSelectionModel) {
        // attempt to restore the previous page
        if (toolbar != null && lastSelectionModel != null) {
            gridPanel.setSelectionModel(lastSelectionModel);
        }
       // Issue occur here..... In PagingToolbar.
        toolbar = new PagingToolbar();
    }
PagingToolbar.java

class PagingToolbar {
    @Inject
    private transient I18nUtils i18n;

    /**
     * Creates a new paging toolbar.
     */
    public PagingToolbar() {
        super();
        setDisplayingItemsText(i18n.getText(this, "facebook")); 
    // here i18n get null and throws null pointer-exception.
}

ATest.java

class editorModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(I18nUtils.class)
                .to((Class < ? extends I18nUtils >) A.class);

    }
}
@Test(groups = { "unit" })
public class ATest extends AbstractModule {

    @Test
    public void resetToolbar(){

        I18nUtils i18n = createNiceMock(I18nUtils.class);
        Injector injector = Guice.createInjector(new editorModule());
        A editor = injector.getInstance(A.class);

        // Invoke
        A tt = new A();
        tt.resetToolbar(listselectmodelMock);
    }
}
class editorModule扩展了AbstractModule{
@凌驾
受保护的void configure(){
绑定(I18nUtils.class)
.至((类别<?扩展I18nUtils>)A.类别);
}
}
@测试(组={“单元”})
公共类ATest扩展了AbstractModule{
@试验
公共无效重置工具栏(){
I18nUtils i18n=createNiceMock(I18nUtils.class);
Injector=Guice.createInjector(新编辑器模块());
编辑器=injector.getInstance(A.class);
//援引
A tt=新的A();
tt.resetToolbar(listselectmodelMock);
}
}

注意:在resetToolbar()中的一个类中,我必须使用new关键字调用pagingToolbar。

因为您正在使用
new pagingToolbar()自己创建
pagingToolbar

使用
提供者
在您的
A.java
中:

class A {

  private final Provider<PagingToolbar> pagingToolbarProvider;
  private PagingToolbar toolbar;

  @Inject
  A(Provider<PagingToolbar> pagingToolbarProvider) {
    this.pagingToolbarProvider = pagingToolbarProvider;
    this.toolbar = pagingToolbarProvider.get();
  }

  void resetToolbar(final ListSelectionModel lastSelectionModel) {
    // attempt to restore the previous page
    if (toolbar != null && lastSelectionModel != null) {
        gridPanel.setSelectionModel(lastSelectionModel);
    }
    toolbar = pagingToolbarProvider.get();
  }

}
A类{
私人最终提供商pagingToolbarProvider;
专用分页工具栏;
@注入
A(提供程序pagingToolbarProvider){
this.pagingToolbarProvider=pagingToolbarProvider;
this.toolbar=pagingToolbarProvider.get();
}
无效重置工具栏(最终列表SelectionModel lastSelectionModel){
//尝试还原上一页
如果(工具栏!=null&&lastSelectionModel!=null){
gridPanel.setSelectionModel(lastSelectionModel);
}
toolbar=pagingToolbarProvider.get();
}
}

是的,您是对的,但我无法重构代码,因为代码只有几行。是否有任何方法可以在测试类中配置()绑定并从中调用,以便它像Google Guice injector Worked一样持续调用,同时运行应用程序i18n获取正确的数据,而不给我null和resetToolbar工作正常。但对于测试来说,它无法获取正确的数据。如果代码相同,它甚至无法在生产环境中工作。
toolbar=newpagingtoolbar()
PagingToolbar
必须通过
Injector#getInstance
方法注入或获取。