大分暖かくなって来ました。
暖かくなってくると、旅に出たくなります。
特に、春なら鹿がお勧めです。
ついでに勉強会にも参加しましょう。
というわけで、
鹿駆動勉強会
とかいうのにエントリーすることになりました。
能楽堂でLTをするらしいです。
で、ネタ
JavaFX1のときはあまり惹かれなかったんですが、
JavaFX2になって、Webkit搭載となったので、
おお、JUnitでjavascriptのテストできんじゃね~と思ったので、
試してみることにしました。
まあ、その辺の経緯はtogetterにまとめてます。
事前にJavaFXとThreadにハマった言い訳を書いておく
もともと業務SEだったオレなので、
JavaのGUIとかはあまり触ったことがないというか、
ほとんど触ったことがないというか、
Javaを勉強した時にチョコっと触っただけです。はい。
なので、かなりクソいコードになっています。
サーバーサイドのJavaは書いたことありますです。
テスト対象のJavascript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function numberTest(arg) { | |
return 1 + arg; | |
} | |
function stringTest(arg) { | |
return arg + "_" + "test"; | |
} | |
function objectTest(arg) { | |
arg.test = 'value'; | |
return arg; | |
} | |
(function() { | |
var element = document.getElementById('loaded'); | |
element.innerText = 'loaded'; | |
})(); |
特に大したことのないコードです。
数字を返す関数、文字列を加工して返す関数、オブジェクトを返す関数です。
テスト戦略???
テスト対象のJavascriptは大したことのないものですが、
ajaxアプリケーションのテストもやっていきたいので、
サーバーを立てていこうと思います。
JUnitでテストサーバーを立てる場合、
以前のエントリにも書きましたが、
Jettyエンベデッドサーバーを用いていきます。
サーバーが立ち上がった後で、ブラウザを立ち上げて、javascriptのテストをしていくという流れになります。
したがって、書いていくJUnitのコードは次のようになります。
@BeforeClass
にてJettyサーバーを立ち上げる。@Before
にてブラウザーを立ち上げる。@Test
にてJavascriptのテストを実行する。@After
にてブラウザーを終了させる。@AfterClass
にてJettyサーバーを終了する。
JUnitのコード
次のような感じです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package org.mikeneck.jfx; | |
import javafx.scene.web.WebEngine; | |
import javafx.scene.web.WebView; | |
import org.eclipse.jetty.server.Server; | |
import org.junit.*; | |
import org.mikeneck.jfx.handler.RequestHandler; | |
import java.net.InetSocketAddress; | |
/** | |
* @author: mike | |
* @since: 12/03/04 | |
*/ | |
public class JsJUnit { | |
private static Server server; | |
protected static final String HOST = "localhost"; | |
protected static final int PORT = 3080; | |
protected static final String URL = "http://localhost:3080"; | |
private static InetSocketAddress address = new InetSocketAddress(HOST, PORT); | |
private WebView webView = null; | |
private WebEngine webEngine = null; | |
@Test | |
public void test () { | |
Object result = webEngine.executeScript("numberTest(1)"); | |
System.out.println(result); | |
} | |
@Before | |
public void setUpBrowser() { | |
webView = new WebView(); | |
webEngine = webView.getEngine(); | |
webEngine.load(URL); | |
} | |
@After | |
public void tearDownBrowser () { | |
webEngine = null; | |
webView = null; | |
} | |
@BeforeClass | |
public static void serverStarts () throws Exception { | |
setUpWebServer(); | |
} | |
private static void setUpWebServer() throws Exception { | |
server = new Server(address); | |
RequestHandler handler = new RequestHandler(server); | |
server.setHandler(handler); | |
server.start(); | |
} | |
@AfterClass | |
public static void stopServer () throws Exception { | |
server.stop(); | |
server.destroy(); | |
} | |
} |
なお、ハンドラーをJUnitに書くと若干読みづらくなるので、ハンドラーは別クラスにしてあります。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package org.mikeneck.jfx.handler; | |
import org.eclipse.jetty.server.Request; | |
import org.eclipse.jetty.server.Server; | |
import org.eclipse.jetty.server.handler.AbstractHandler; | |
import javax.servlet.ServletException; | |
import javax.servlet.http.HttpServletRequest; | |
import javax.servlet.http.HttpServletResponse; | |
import java.io.*; | |
/** | |
* @author: mike | |
* @since: 12/02/22 | |
*/ | |
public class RequestHandler extends AbstractHandler { | |
private Server server; | |
public RequestHandler(Server server) { | |
this.server = server; | |
} | |
@Override | |
public void handle(String target, | |
Request request, | |
HttpServletRequest httpServletRequest, | |
HttpServletResponse httpServletResponse) | |
throws IOException, ServletException { | |
System.out.println("request : " + target); | |
if ("/".equals(target)) { | |
httpServletResponse.setStatus(200); | |
PrintWriter writer = httpServletResponse.getWriter(); | |
File file = new File("src/test/resources/index.html"); | |
FileReader reader = null; | |
try { | |
reader = new FileReader(file); | |
BufferedReader bufferedReader = new BufferedReader(reader); | |
while (bufferedReader.ready()) { | |
String line = bufferedReader.readLine(); | |
writer.write(line); | |
writer.write('\n'); | |
} | |
} finally { | |
reader.close(); | |
writer.flush(); | |
} | |
} else if ("/js/test.js".equals(target)) { | |
httpServletResponse.setStatus(200); | |
PrintWriter writer = httpServletResponse.getWriter(); | |
File file = new File("src/test/resources/js/test.js"); | |
FileReader reader = null; | |
try { | |
reader = new FileReader(file); | |
BufferedReader bufferedReader = new BufferedReader(reader); | |
while (bufferedReader.ready()) { | |
String line = bufferedReader.readLine(); | |
writer.write(line); | |
writer.write('\n'); | |
} | |
} finally { | |
reader.close(); | |
writer.flush(); | |
} | |
} else if ("/end".equals(target)) { | |
httpServletResponse.setStatus(200); | |
httpServletResponse.getWriter().flush(); | |
this.server.destroy(); | |
} | |
} | |
} |
ハマる様子をとくと見よ
さて、
JsJUnit
を実行してみるとこんな感じになる。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2012-03-06 19:07:56.020:INFO:oejs.Server:jetty-8.1.0.v20120127 | |
2012-03-06 19:07:57.119:INFO:oejs.AbstractConnector:Started SelectChannelConnector@localhost:3080 | |
java.lang.IllegalStateException: Not on FX application thread; currentThread = main | |
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:218) | |
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:360) | |
at com.sun.webpane.sg.prism.InvokerImpl.checkEventThread(InvokerImpl.java:58) | |
at com.sun.webpane.platform.WebPage.<init>(WebPage.java:194) | |
at com.sun.webpane.sg.ImplementationManager.createPage(ImplementationManager.java:55) | |
at com.sun.webpane.sg.ImplementationManager.createPage(ImplementationManager.java:49) | |
at javafx.scene.web.WebEngine.<init>(WebEngine.java:393) | |
at javafx.scene.web.WebEngine.<init>(WebEngine.java:380) | |
at javafx.scene.web.WebView.<init>(WebView.java:160) | |
at org.mikeneck.jfx.JsJUnit.setUpBrowser(JsJUnit.java:39) | |
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | |
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) | |
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) | |
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) | |
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) | |
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) | |
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27) | |
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) | |
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) | |
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) | |
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) | |
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) | |
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) | |
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) | |
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) | |
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) | |
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) | |
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) | |
at org.junit.runners.ParentRunner.run(ParentRunner.java:300) | |
at org.junit.runner.JUnitCore.run(JUnitCore.java:157) | |
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:71) | |
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:199) | |
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:62) | |
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) | |
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) | |
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) | |
Process finished with exit code -1 |
JavaFXの
WebView
はJavaFXのThreadで立ち上げなければならないらしいだって(´・ω・`)さて、まだまだハマるのだが、それは後日。
0 件のコメント:
コメントを投稿