在教人使用Java Processing Libary的过程中,遇见一个小插曲, Boss要求Java程序的Junit测试的Coverage要超过90%, 其实对于这种带GUI的程序是没必要搞这么高的Coverage的, GUI程序的自动化测试还是有很大困难的,但是没办法,只能在Junit中将Processing的GUI程序加载运行起来,跑够Coverage. (就是为了测试而进行测试了).
这里就遇见了两个问题:
1.如何在Junit中启动Java Processing程序.
解决方法:
@BeforeAll
public static void init(){
app = new App();
app.noLoop();
PApplet.runSketch(new String[] { "App" }, app);
app.setup();
app.delay(1000);
}
通过Junit @BeforeAll保证测试Class中只启动一份Application.
app.noLoop意味不要让Processing按照设定的FPS自动调用draw函数,由于Processing按照FPS自动调用draw会引起一些线程同步问题
2. 线程同步问题
因为Processing的设定fps后,Processing就会定期启动Thread调用PApplet的draw函数,而测试程序会在测试case中修改draw相关的数据(修改显示的数组元素等),导致线程同步错误,出现奇怪的Null Pointer错误.
解决方案就是通过App(PApplet的子类)的noLoop和loop来控制.
// Do someting...
// ....
app.loop(); // 启动Loop,让Processing自动调用draw函数
app.delay(50); //延时保证自动调用的Draw能进行一次以上
app.noLoop(); //关闭自动调用Draw
app.delay(100);