对于学校项目,我必须测试我的一个课程。编写并执行测试后,我收到以下错误消息和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.
感谢您的帮助! 干杯,罗米
答案 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);
}
}