scala で書かれた GUI アプリケーションの自動テストを swing で書こうとしています。getName()を活用してツリー内の適切な ui 要素を見つけるこの記事のコードを適応させています。
これは私のコードの自己完結型バージョンです。それは不完全で、テストされておらず、おそらくさまざまな点で壊れている、および/または非慣用的である、および/または最適ではありませんが、私の質問は以下にリストされているコンパイラエラーに関するものです.
import scala.swing._
import java.awt._
import ListView._
import org.scalatest.junit.JUnitRunner
import org.junit.runner.RunWith
import org.scalatest.FunSpec
import org.scalatest.matchers.ShouldMatchers
object MyGui extends SimpleSwingApplication {
def top = new MainFrame {
title = "MyGui"
val t = new Table(3, 3)
t.peer.setName("my-table")
contents = t
}
}
object TestUtils {
def getChildNamed(parent: UIElement, name: String): UIElement = {
// Debug line
println("Class: " + parent.peer.getClass() +
" Name: " + parent.peer.getName())
if (name == parent.peer.getName()) { return parent }
if (parent.peer.isInstanceOf[java.awt.Container]) {
val children = parent.peer.getComponents()
/// COMPILER ERROR HERE ^^^
for (child <- children) {
val matching_child = getChildNamed(child, name)
if (matching_child != null) { return matching_child }
}
}
return null
}
}
@RunWith(classOf[JUnitRunner])
class MyGuiSpec extends FunSpec {
describe("My gui window") {
it("should have a table") {
TestUtils.getChildNamed(MyGui.top, "my-table")
}
}
}
このファイルをコンパイルすると、次のようになります。
29: error: value getComponents is not a member of java.awt.Component
val children = parent.peer.getComponents()
^
one error found
私が知る限り、getComponents は実際には java.awt.Component のメンバーです。この回答のコードを使用して にメソッドをダンプしたparent.peer
ところ、getComponents がリストにあることがわかります。
問題に対する別のアプローチを提供する回答 (同様の方法での自動化された GUI テスト) は大歓迎ですが、getComponents にアクセスできない理由を理解したいと思います。