흔히 알려진 테스트 하기 어려운 모듈은 네트워크, 데이타 베이스, GUI 인데 특히 Swing으로 제작된 GUI 프로그래밍을 테스트 하는 것은 꽤 어렵다.
사실 가장 좋은 방법은 그냥 View 모듈을 Model과 Controller에서 최대한 분리하는 방법이 최선이긴 하다. 그걸로 충분하지 않다면 아래와 같인 자동 로봇을 시도해 볼 수 있다.
아래 코드는 특정 시나리오대로 프로그램을 실행하면서 마지막에 해당 GUI 화면을 갭쳐한다.
package com.bleujin.thinlet.sample.robot;
import java.awt.AWTException;
import java.awt.FlowLayout;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class RobotTest {
public static void main(String[] args) {
ButtonFrame frame = new ButtonFrame() ;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
frame.setVisible(true) ;
GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice screen = environment.getDefaultScreenDevice();
try {
Robot robot = new Robot(screen);
run(robot);
} catch (AWTException ex) {
ex.printStackTrace();
}
}
private static void run(Robot robot) {
robot.keyPress(' ');
robot.keyRelease(' ');
robot.delay(2000);
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
robot.keyPress(' ');
robot.keyRelease(' ');
robot.delay(2000);
robot.mouseMove(200, 50);
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
robot.delay(2000);
BufferedImage image = robot.createScreenCapture(new Rectangle(0, 0, 450, 350));
ImageFrame frame = new ImageFrame(image);
frame.setVisible(true);
}
}
class ButtonFrame extends JFrame {
private JButton plainJButton;
public ButtonFrame() {
super("Testing Buttons");
setSize(450, 350) ;
setLayout(new FlowLayout()); // set frame layout
plainJButton = new JButton("Plain Button");
add(plainJButton);
ButtonHandler handler = new ButtonHandler();
plainJButton.addActionListener(handler);
}
private class ButtonHandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
JOptionPane.showMessageDialog(ButtonFrame.this, String.format("You pressed: %s", event.getActionCommand()));
}
}
}
class ImageFrame extends JFrame {
public ImageFrame(Image image) {
setTitle("Capture");
setSize(450, 350);
JLabel label = new JLabel(new ImageIcon(image));
add(label);
}
} |