이 코드를 고려이 SwingWorker의 코드를 검증 할 수있는 방법
public void actionPerformed(ActionEvent e) {
setEnabled(false);
new SwingWorker<File, Void>() {
private String location = url.getText();
@Override
protected File doInBackground() throws Exception {
File file = new File("out.txt");
Writer writer = null;
try {
writer = new FileWriter(file);
creator.write(location, writer);
} finally {
if (writer != null) {
writer.close();
}
}
return file;
}
@Override
protected void done() {
setEnabled(true);
try {
File file = get();
JOptionPane.showMessageDialog(FileInputFrame.this,
"File has been retrieved and saved to:\n"
+ file.getAbsolutePath());
Desktop.getDesktop().open(file);
} catch (InterruptedException ex) {
logger.log(Level.INFO, "Thread interupted, process aborting.", ex);
Thread.currentThread().interrupt();
} catch (ExecutionException ex) {
Throwable cause = ex.getCause() == null ? ex : ex.getCause();
logger.log(Level.SEVERE, "An exception occurred that was "
+ "not supposed to happen.", cause);
JOptionPane.showMessageDialog(FileInputFrame.this, "Error: "
+ cause.getClass().getSimpleName() + " "
+ cause.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
} catch (IOException ex) {
logger.log(Level.INFO, "Unable to open file for viewing.", ex);
}
}
}.execute();
url
이 JTextField로와 '창조자'인 파일을 기입하기위한 주입 인터페이스 (그래서 그 부분은 테스트 중입니다). 파일이 기록되는 위치는 예제로 의도 되었기 때문에 하드 코딩 된 것입니다. java.util.logging은 단순히 외부 종속성을 피하기 위해 사용됩니다.
어떻게하면 단위 테스트가 가능합니까? (필요한 경우 SwingWorker를 버릴 수 있지만 적어도 여기에서 사용한대로 기능을 대체하는 것을 포함하여) 어떻게 테스트 할 수 있습니까?
내가 보는 방식대로, doInBackground는 기본적으로 괜찮습니다. 기본 메커니즘은 작가를 만들고 닫는 것인데, 테스트하기가 너무 간단하고 실제 작업이 테스트 중입니다. 그러나 done 메소드는 부모 클래스 인 actionPerformed 메소드와의 결합과 버튼의 활성화 및 비활성화를 조정하는 것을 포함하여 문제가됩니다.
그러나 그 차이는 분명하지 않습니다. 어떤 종류의 SwingWorkerFactory를 주입하면 유지 보수하기가 훨씬 어려워 GUI 필드를 캡처 할 수 있습니다 (디자인 개선이 어떻게되는지 알기가 어렵습니다). JOpitonPane과 Desktop은 Singletons의 "장점"을 모두 가지고 있으며 예외 처리는 get을 쉽게 감쌀 수 없도록 만듭니다.
그럼이 코드를 테스트 할 때 좋은 해결책은 무엇입니까?
서식있는 코드; 잘못된 경우 되돌려주십시오. – trashgod
완전한 대답은 아닙니다 :하지만 당신이 품질의 코드를 좋아한다면,'SwingWorker'를 가까이 가지 마십시오. 일반적으로 요인을 밖으로 나눕니다. 정적/싱글 톤을 사용하는 API를 사용하는 곳에서는 "실제"정적 API를 사용하는 구현과 조롱을 위해 인터페이스를 도입합니다 (감사용으로 사용할 수도 있습니다). –
@Tom, SwingWorker에 대안 디자인의 개요를 쓸 시간이 있다면 (또는 더 나은 대안을 알고 있다면) 대단히 감사하겠습니다. – Yishai