交互测试接口的简单实现
1. 问题
或者你已经习惯了写 Hardcode JUnit Test Case。但这里有问题:
l 你写的代码要经过 Java compiler 才可运行,但实际的环境下不一定允许这样
l 很难用于交互测试与开发期的错误跟踪。不能要求你的交互测试环境总有一个 Java IDE。
上述问题在 Java Application 的 RMI 接口测试和错误跟踪时就更明显。
2. 解决方法
要做交互测试与错误跟踪,要面对的情况是不可料的,故很难用 Hardcode 的静态语言 Java 去做。但我对动态语言(如 BeanShell )也不大了解。但相对比较了解 Java 的反射机制与 XStream(http://xstream.codehaus.org/) 的从 XML 文本到 Java Object 的应用
Java 的 reflect(反射) + XStream 的 文本到 Object instance :
publicclass MyMethodInfo implements Comparable<MyMethodInfo> { public Method method; public MyMethodInfo(Method method) { this.method = method; } public String toString() { StringBuilder builder = new StringBuilder(); builder.append( method.getName() ).append( " (" ); Class[] params = method.getParameterTypes(); for( int i = 0 ; i < params.length; i++ ) { builder.append( params[i].getSimpleName() ); if( i < params.length - 1 ) { builder.append( ", " ); } } builder.append( ')' ); return builder.toString(); } publicint compareTo(MyMethodInfo o) { returnthis.method.getName().compareTo( o.method.getName() ); } } |
publicclass MethodArgPanel extends JPanel { privatestaticfinallongserialVersionUID = 1L; private JScrollPane jScrollPane = null; private JTextArea argTextArea = null; /** *Thisisthedefaultconstructor */ public MethodArgPanel() { super(); initialize(); } /** *Thismethodinitializesthis * *@returnvoid */ privatevoid initialize() { this.setSize(246, 230); this.setLayout(new BorderLayout()); this.add(getJScrollPane(), BorderLayout.CENTER); } /** *ThismethodinitializesjScrollPane * *@returnjavax.swing.JScrollPane */ private JScrollPane getJScrollPane() { if ( jScrollPane == null ) { jScrollPane = new JScrollPane(); jScrollPane.setViewportView(getArgTextArea()); } returnjScrollPane; } /** *ThismethodinitializesargTextArea * *@returnjavax.swing.JTextArea */ private JTextArea getArgTextArea() { if ( argTextArea == null ) { argTextArea = new JTextArea(); } returnargTextArea; } public String getText() { returnargTextArea.getText(); } } // @jve:decl-index=0:visual-constraint="10,10" |
publicclass MainFrame extends JFrame { privatestaticfinallongserialVersionUID = 1L; private JPanel jContentPane = null; private JSplitPane mainSplitPane = null; private JSplitPane leftSplitPane = null; private JPanel cmdPanel = null; private JButton execButton = null; private JScrollPane argsScrollPane = null; private JPanel argsPanel = null; private JScrollPane resultScrollPane = null; private JTextArea resultTextArea = null; private JScrollPane methodScrollPane = null; private JList methodList = null; private MethodArgPanel[] methodArgPanels; private Object proxy; /** *ThismethodinitializesmainSplitPane * *@returnjavax.swing.JSplitPane */ private JSplitPane getMainSplitPane() { if ( mainSplitPane == null ) { mainSplitPane = new JSplitPane(); mainSplitPane.setDividerLocation( 200 ); mainSplitPane.setRightComponent( getLeftSplitPane() ); mainSplitPane.setLeftComponent( getMethodScrollPane() ); } returnmainSplitPane; } /** *ThismethodinitializesleftSplitPane * *@returnjavax.swing.JSplitPane */ private JSplitPane getLeftSplitPane() { if ( leftSplitPane == null ) { leftSplitPane = new JSplitPane(); leftSplitPane.setOrientation( JSplitPane.VERTICAL_SPLIT ); leftSplitPane.setDividerSize( 8 ); leftSplitPane.setDividerLocation( 400 ); leftSplitPane.setBottomComponent( getResultScrollPane() ); leftSplitPane.setTopComponent( getCmdPanel() ); } returnleftSplitPane; |