0

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 にアクセスできない理由を理解したいと思います。

4

1 に答える 1

1

問題は、2 つの異なるクラスを見ていることです。java.awt.Containerあなたのjavadocリンクは、実際にgetComponentsメソッドを持っているを指しています。一方、コンパイラはによって返されるgetComponentson java.awt.Component(親クラス) をparent.peer探していますが、見つかりません。

の代わりにif (parent.peer.isInstanceOf[java.awt.Container]) ...、parent.peer のタイプを確認して、次のようにキャストできます。

parent.peer match {
      case container: java.awt.Container =>
         // the following works because container isA Container
         val children = container.getComponents
        // ...
      case _ => // ...
}
于 2013-04-11T05:27:01.153 に答える