You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GWT单元测试报NullPointerException:this.service为空该如何解决?

解决GWT单元测试中service为空的问题

问题原因

你的判断正确,gwtSetUp()方法未被GWT测试框架执行,导致service变量未初始化,调用时触发空指针异常。核心问题是测试类的继承关系和gwtSetUp()方法的签名不符合GWT测试规范。

修复步骤

  • 确保测试类继承GWTTestCase
    GWT单元测试类必须继承com.google.gwt.junit.client.GWTTestCase,否则测试框架无法识别并执行gwtSetUp()方法。

  • 修正gwtSetUp()方法签名
    该方法需使用protected访问修饰符,添加@Override注解确保重写父类方法,同时声明可能抛出的异常,并且必须调用父类的gwtSetUp()方法:

    @Override
    protected void gwtSetUp() throws Exception {
        super.gwtSetUp();
        service = GWT.create(StudenteService.class);
        ServiceDefTarget target = (ServiceDefTarget) service;
        target.setServiceEntryPoint(GWT.getModuleBaseURL() + "progettosweng/studenti");
    }
    
  • 补充测试结束标记
    测试方法中调用了delayTestFinish(10000),但回调方法中未调用finishTest()会导致测试超时,需在onSuccess和onFailure中补充:

    @Test
    public synchronized void getNumeroStudenti() throws Exception {
        delayTestFinish(10000);
        service.getNumeroStudenti(new AsyncCallback<Integer>() {
            @Override
            public void onFailure(Throwable caught) {
                fail("FAIL: getNumeroStudenti");
                finishTest();
            }
    
            @Override
            public void onSuccess(Integer result) {
                assertTrue(true);
                finishTest();
            }
        });
    }
    

完整修正后的测试类示例

import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.university.client.services.StudenteService;
import com.university.client.services.StudenteServiceAsync;

public class StudenteServiceTest extends GWTTestCase {

    StudenteServiceAsync service;

    @Override
    protected void gwtSetUp() throws Exception {
        super.gwtSetUp();
        service = GWT.create(StudenteService.class);
        ServiceDefTarget target = (ServiceDefTarget) service;
        target.setServiceEntryPoint(GWT.getModuleBaseURL() + "progettosweng/studenti");
    }

    @Override
    public String getModuleName() {
        return "com.university";
    }

    @Test
    public synchronized void getNumeroStudenti() throws Exception {
        delayTestFinish(10000);
        service.getNumeroStudenti(new AsyncCallback<Integer>() {
            @Override
            public void onFailure(Throwable caught) {
                fail("FAIL: getNumeroStudenti");
                finishTest();
            }

            @Override
            public void onSuccess(Integer result) {
                assertTrue(true);
                finishTest();
            }
        });
    }
}

内容的提问来源于stack exchange,提问作者Mr Alsi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:41:13