我正在 OS X 上开发基于 SWT 的应用程序,我想在一些需要 SWT 事件循环但不一定存在的实用程序代码上编写一些 JUnit 测试用例(不是自动化 GUI 测试)图形用户界面。我遇到了很多问题。
作为一些故障代码的精简示例:我有一个基于以下模式的小型重复 SWT 计时器实用程序:
public class RepeatingSWTTimer
{
private boolean isRunning = false;
private RepeatingSWTTimerAction timerAction;
private int delay;
private Runnable timerRunnable = new Runnable()
{
@Override
public void run()
{
timerAction.fire();
if(isRunning)
{
Display.getCurrent().timerExec(delay, this);
}
}
};
public void start()
{
isRunning = true;
Display.getCurrent().timerExec(delay, timerRunnable);
}
}
代码工作得很好,实际的类不仅仅是一种方法,而且我在我的应用程序的很多地方都使用它而没有问题。但我仍然想用一个测试用例来覆盖它。
我遇到的主要问题是:
如果没有 Display 实例化(例如在调用
Display.getDefault()
in 中@BeforeClass
),那么Display.getCurrent()
将返回一个 Null 指针。如果有一个 Display 实例化但没有样板循环代码(
while(!shell.isDisposed())...
等),那么事件循环似乎不会被底层的本机系统抽出。如果我在 中打开一个简单的 shell
@BeforeClass
,它会阻止 JUnit 测试用例。在我关闭 shell 之前它们不会运行,这让我回到了原来的问题。我假设这是由于-XstartOnFirstThread
OS X 的要求。
我知道有类似使用 SWTSWTBot
进行自动化GUI测试的工具,但我只需要一些简单的 JUnit 案例来涵盖我的非 GUI 实用程序代码。
有没有人经历过这样的事情?