在JUnit中使用带有GWTTestCase的DataTable.create()时的JavaScriptException

时间:2014-11-11 12:28:29

标签: java javascript gwt junit datatable

对于学校项目,我必须测试我的一个课程。编写并执行测试后,我收到以下错误消息和stacktrace:

com.google.gwt.core.client.JavaScriptException: (null)       
@com.google.gwt.visualization.client.DataTable::create()([]): null
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:249)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:576)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:284)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
at com.google.gwt.visualization.client.DataTable$.create(DataTable.java)
at com.gwt.client.VizualizationManagerTest.gwtSetUp(VizualizationManagerTest.java:150)
...

根据我的阅读,问题在于方法:DataTable.create(),它会创建一个默认的DataTable,以后可能会填充列和行。

我想测试数据是否正确设置。在我的课堂上,我正在测试验证初始数据是否正在重新格式化,以便它可以用于GWT Graphs。所以基本上我选择了一个非常大的DataTable并将其转换为ArrayList更小的DataTables。但据我所知,我的测试甚至没有测试那个特定的方法,但卡在@Before方法gwtSetUp() DataTable.create()上。

以下是我的测试代码:

package com.gwt.client;

import static org.junit.Assert.*;
import java.util.Random;
import org.junit.Before;
import org.junit.Test;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.visualization.client.AbstractDataTable;
import com.google.gwt.visualization.client.DataTable;
import com.google.gwt.visualization.client.AbstractDataTable.ColumnType;

public class VizualizationManagerTest extends GWTTestCase {
    @Test
    public void testPrepareData() {
        VisualizationManager.TableDATA = (DataTable) data;
        VisualizationManager.prepareData();
        assertEquals(data.getNumberOfColumns(), VisualizationManager.DATA.length);
        assertEquals(data.getNumberOfRows(), VisualizationManager.DATA[VisualizationManager.DATA.length-1].getNumberOfRows());

        //check all Cells for equality
        for (int i = 0; i < data.getNumberOfColumns()-1; i++) {
            for (int j = 0; j < data.getNumberOfRows(); j++) {
                String test1 = VisualizationManager.DATA[i].getFormattedValue(j, 0);
                String tested1 = data.getFormattedValue(j, i+1);
                assertEquals(tested1, test1);
            }
        }
    }

    public AbstractDataTable data;

    @Before
    public void gwtSetUp() {
        DataTable mydata = DataTable.create();
        mydata.addColumn(ColumnType.STRING, "Country");
        mydata.addColumn(ColumnType.NUMBER, "2011");
        mydata.addColumn(ColumnType.NUMBER, "2010");
        mydata.addColumn(ColumnType.NUMBER, "2009");
        mydata.addRows(5);
        mydata.setCell(0, 0, "Switzerland", "Switzerland", null);
        mydata.setCell(1, 0, "Germany", "Germany", null);
        mydata.setCell(2, 0, "Austria", "Austria", null);
        mydata.setCell(3, 0, "Slovakia", "Slovakia", null);
        mydata.setCell(4, 0, "Czech Republic", "Czech Republic", null);
        Random random = new Random();
        for (int i=1; i<4; i++) {
            for (int j=0; j<5; j++) {
                double number = random.nextDouble() % 1000.0;
                mydata.setCell(j, i, number, Double.toString(number), null);
            }
        }
        data = mydata;
    }

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

不幸的是,我无法找到解决问题的方法。我无法判断它是否与整个测试的设置有关,或者只是我不能用类DataTable进行测试,或者可能是不同的......

我在OS X Yosemite(10.10)上使用Eclipse Luna和Java 7更新71.

感谢您的帮助! 干杯,罗米

1 个答案:

答案 0 :(得分:0)

所有GWT Visualization内容(在实际代码中以及JUnit和GWTtestCase中)的问题在于它需要在Web上重新加载。 这意味着,与GWT Visualization有关的所有内容都需要按以下方式编写:

class Test extends GWTTestCase{
    @Test
    public void testSomething{
        Runnable onLoadCallback = new Runnable() {
            public void run() {
                ...
            }
        };

        VisualizationUtils.loadVisualizationApi(onLoadCallback, Table.PACKAGE);
    }
}