上下文是单元测试:在测试结束时,在tearDown
,如果JFileChooser
被“悬挂”(即显示),我想强制它返回“已取消”值。
问题是,否则,actionPerformed()
我称之为showOpenDialog
(阻止方法)仍在继续......我需要关闭Runnable
。
注意Runnable
正在运行actionPerformed
当然是在EDT中运行的。但尽管如此,该框架能够启动另一个“事件泵”:我的理解是,当您在EDT中执行JFileChooser.showOpenDialog
时,这是非常正常和正确的行为:类似于调用其中一个{{1} EDT中的静态方法。
我还想避免一个“测试设计”的解决方案:换句话说,应用程序代码必须足够自己,并且不要使用曲折或不自然的机制知道它将通过测试运行需要提供“句柄”的代码。
PS我实际上使用的是Jython而不是Java,我使用的是Python JOptionPane.showXXX
模块,而不是基于Java的单元测试框架。但这并没有改变所涉及的原则......
PPS (稍后) 我设计了一种方法,我认为这种方法相当“不稳定”:这需要深入研究unittest
以确定{ {1}} JFileChooser
==“取消”。对不起,它是用Jython编写的,但即使对那些不懂Python的人也应该很容易理解:
JButton
这是“不稳定的”,尤其是因为按钮的“取消”文本可能会被另一种语言的其他名称替换...
答案 0 :(得分:1)
JFileChooser chooser = new JFileChooser();
chooser.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if( e.getActionCommand().equals("CancelSelection") )
{
chooser.cancelSelection();
}
}
} );
public void forceCancel()
{
ActionEvent e = new ActionEvent(chooser, ActionEvent.ACTION_PERFORMED, "CancelSelection");
fireActionPerformed(e);
}
public void fireActionPerformed( ActionEvent e )
{
ActionListener[] listeners = chooser.getActionListeners();
for( ActionListener listener : listeners )
{
listener.actionPerformed( e );
}
}
使用此代码,您可以调用forceCancel()
来触发操作事件以自动取消JFileChooser
。您可以在单元测试中加入forceCancel()
。
(OR)
如果你的Jython调用component.cancelSelection()中的组件是通过make对组件进行检查的实例。