load_from_xmlでNoMethodErrorが発生

46 views
Skip to first unread message

taka_2

unread,
Aug 13, 2008, 9:02:38 AM8/13/08
to rubeus
初めて書きます。
重元と申します。

rubeusの理解も兼ねて、
テストコードなぞ書いてみようと思い立ちました。

とりあえず分かりやすいと思ったところで、
DefaultTableModel拡張の、load_from_xmlをテストしてみました。

概ね良かったのですが、
:column_pathsに存在しないカラム名を指定すると、
以下のようなエラーが発生します。

--------------------------------------------------------------------------------
1) Error:
test_load_from_xml_invalid_column_paths(TestDefaultTableModel):
NoMethodError: undefined method `text' for nil:NilClass
/opt/jruby-1.1.3/lib/ruby/gems/1.8/gems/rubeus-0.0.5-java/lib/
rubeus/extensions/javax/swing/table/default_table_model.rb:86:in
`load_from_xml'
/opt/jruby-1.1.3/lib/ruby/gems/1.8/gems/rubeus-0.0.5-java/lib/
rubeus/extensions/javax/swing/table/default_table_model.rb:86:in `map'
/opt/jruby-1.1.3/lib/ruby/gems/1.8/gems/rubeus-0.0.5-java/lib/
rubeus/extensions/javax/swing/table/default_table_model.rb:86:in
`load_from_xml'
/opt/jruby-1.1.3/lib/ruby/1.8/rexml/element.rb:890:in `each'
/opt/jruby-1.1.3/lib/ruby/1.8/rexml/xpath.rb:53:in `each'
/opt/jruby-1.1.3/lib/ruby/1.8/rexml/element.rb:890:in `each'
/opt/jruby-1.1.3/lib/ruby/gems/1.8/gems/rubeus-0.0.5-java/lib/
rubeus/extensions/javax/swing/table/default_table_model.rb:85:in
`load_from_xml'
/opt/jruby-1.1.3/lib/ruby/gems/1.8/gems/rubeus-0.0.5-java/lib/
rubeus/extensions/javax/swing/j_table.rb:44:in `method_missing'
test_default_table_model.rb:110:in
`test_load_from_xml_invalid_column_paths'
--------------------------------------------------------------------------------

無いカラムは無視して欲しいような気がしますが、
いかがでしょうか。


なお、試しで作ったテストは、
とりあえず、firestorageというサービスを使って置いてあります。
1週間ほどで消えてしまうようです。

・テストクラス
http://firestorage.jp/download/bf82c6ebdf42d68500bdafc0a4c1b1d2e481fb29

・テストデータ(xmlファイル)
http://firestorage.jp/download/66767cdbfd82e7f6930c8361df216c53da2b7ffe


あと、テストの書きっぷりについて、
何かご意見あればよろしくお願いします。

秋間武志

unread,
Aug 13, 2008, 10:07:55 AM8/13/08
to rub...@googlegroups.com
重元さん

テストケースありがとうございますっ!!秋間です。
何の前振りもなく、なんちゅう嬉しいことを!
早速コミットさせて頂きました。

テストを動かすに当たって、カレントディレクトリに依存していたので
どのディレクトリでも実行できるようにsetupメソッドを変更させて
頂きました。それ以外についてはもうバッチリだと思います。

> 無いカラムは無視して欲しいような気がしますが、
> いかがでしょうか。

うーん、そういう場合もあるでしょうし、間違いに気付けるように
例外が発生してほしい気もします。

オプションに :ignore_unexist_column とか追加して、例外を出すか
無視するかを選べるようにしましょうか。
デフォルトは例外を出す方がいいと思いますが、どうでしょう?

2008/08/13 22:02 taka_2 <Takahiro....@gmail.com>:

taka_2

unread,
Aug 13, 2008, 10:30:46 AM8/13/08
to rubeus
重元です。

速攻レスありがとうございます。

> > 無いカラムは無視して欲しいような気がしますが、
> > いかがでしょうか。
>
> うーん、そういう場合もあるでしょうし、間違いに気付けるように
> 例外が発生してほしい気もします。
>
> オプションに :ignore_unexist_column とか追加して、例外を出すか
> 無視するかを選べるようにしましょうか。
> デフォルトは例外を出す方がいいと思いますが、どうでしょう?

そう言われると、そんな気もします。。

ただ、出ている例外が、
>NoMethodError: undefined method `text' for nil:NilClass
なので、
もう少し分かりやすい別の例外(ArgumentErrorとか?)を
投げ直すようにした方が良いのではないでしょうか。

テストはもうちょっと書いてみますね。
カレントディレクトリに依存の件、変更ありがとうございます。

On 8月13日, 午後11:07, "秋間武志" <akm2...@gmail.com> wrote:
> 重元さん
>
> テストケースありがとうございますっ!!秋間です。
> 何の前振りもなく、なんちゅう嬉しいことを!
> 早速コミットさせて頂きました。
>
> テストを動かすに当たって、カレントディレクトリに依存していたので
> どのディレクトリでも実行できるようにsetupメソッドを変更させて
> 頂きました。それ以外についてはもうバッチリだと思います。
>
> > 無いカラムは無視して欲しいような気がしますが、
> > いかがでしょうか。
>
> うーん、そういう場合もあるでしょうし、間違いに気付けるように
> 例外が発生してほしい気もします。
>
> オプションに :ignore_unexist_column とか追加して、例外を出すか
> 無視するかを選べるようにしましょうか。
> デフォルトは例外を出す方がいいと思いますが、どうでしょう?
>
> 2008/08/13 22:02 taka_2 <Takahiro.Shigem...@gmail.com>:

akm2000

unread,
Aug 30, 2008, 5:00:04 AM8/30/08
to rubeus
重元さん

またまたレスポンスが遅くてすいません。秋間です。

load_from_xmlの件ですが、:ignore_unexist_column オプションを
追加して、それが指定されていない場合に、どのカラムがないよという
例外をraiseするように変更しました。コミットしてあります。

今日、名古屋の勉強会で カラム名をケアレスミスしても分からない、
という方が多かったので、デフォルトでは例外を出す方がいいなと
確信しました。

宜しくお願い致します。

taka_2

unread,
Aug 30, 2008, 1:40:58 PM8/30/08
to rubeus
秋間さん

重元です。

下記件、ありがとうございます。
ArgumentErrorが出るようになったので、
それを捕捉した場合に、テストOKとなるようテストケースを書き換えました。
:ignore_unexist_columnオプションのテストは別途追加します。

秋間武志

unread,
Aug 31, 2008, 9:38:23 AM8/31/08
to rub...@googlegroups.com
重元さん

秋間です。
いつもありがとうございます。本当助かります。

テストを実行してみましたが、
66 tests, 199 assertions, 1 failures, 1 errors
という結果になりました。

標準出力をファイルに出したものを添付します。
環境は、Mac OS X 10.5.4 + Java 1.5.0_13 + jruby 1.1.3
です。

僕も調べますが、何か気付いた方は教えていただけると
すごく嬉しいです!

で、これらがfixしたら0.0.6をリリースしようと思います。

2008/08/31 2:40 taka_2 <Takahiro....@gmail.com>:

rubeus_test_all_output.txt

taka_2

unread,
Aug 31, 2008, 10:30:05 AM8/31/08
to rubeus
秋間さん

重元です。

Failureの方は、配列の並び順が違うっていうことですね。
ソートしてから比較するようにしたら、うまくいくかも。

Errorの方は、REXML::Documentとオプション(row_pathとかcolumn_pathsとか)
をDefaultTableModelのコンストラクタに指定するパターンのテストですが、
リビジョン200でテストが通るように修正しています。
(http://code.google.com/p/rubeus/source/detail?r=200)

DefaultTableModelをデフォルトコンストラクタで構築した場合、
モデルはカラム無しになるのですが、
カラム無しの場合は、load_from_xmlでデータが設定されません。

このため、デフォルトコンストラクタではなく、
カラム名を:column_pathsで指定されたArrayを元に
構築するようにしています。

On 8月31日, 午後10:38, "秋間武志" <akm2...@gmail.com> wrote:
> 重元さん
>
> 秋間です。
> いつもありがとうございます。本当助かります。
>
> テストを実行してみましたが、
> 66 tests, 199 assertions, 1 failures, 1 errors
> という結果になりました。
>
> 標準出力をファイルに出したものを添付します。
> 環境は、Mac OS X 10.5.4 + Java 1.5.0_13 + jruby 1.1.3
> です。
>
> 僕も調べますが、何か気付いた方は教えていただけると
> すごく嬉しいです!
>
> で、これらがfixしたら0.0.6をリリースしようと思います。
>
> 2008/08/31 2:40 taka_2 <Takahiro.Shigem...@gmail.com>:
> [rubeus_test_all_output.txt]Loaded suite .
> Started
> .........F.......................................................E
> Finished in 2.2640000000000002 seconds.
>
> 1) Failure:
> test_events(TestEvent)
> [/Users/akm/rbc/rubeus-trunk/test/rubeus/awt/test_event.rb:66:in `test_events'
> /usr/local/jruby-1.1.3/lib/ruby/gems/1.8/gems/rubeus-0.0.5-java/lib/rubeus/awt/nestable.rb:35:in `add_new_component_to'
> /usr/local/jruby-1.1.3/lib/ruby/gems/1.8/gems/rubeus-0.0.5-java/lib/rubeus/awt/nestable.rb:80:in `add_new_component_to'
> /usr/local/jruby-1.1.3/lib/ruby/gems/1.8/gems/rubeus-0.0.5-java/lib/rubeus/awt/nestable.rb:71:in `process_block_for_new'
> /usr/local/jruby-1.1.3/lib/ruby/gems/1.8/gems/rubeus-0.0.5-java/lib/rubeus/awt/nestable.rb:53:in `new_with_nestable'
> /Users/akm/rbc/rubeus-trunk/test/rubeus/awt/test_event.rb:65:in `test_events']:
> <{"component"=>
> ["component_hidden",
> "component_moved",
> "component_resized",
> "component_shown"],
> "container"=>["component_added", "component_removed"],
> "focus"=>["focus_gained", "focus_lost"],
> "hierarchy"=>["hierarchy_changed"],
> "hierarchy_bounds"=>["ancestor_moved", "ancestor_resized"],
> "input_method"=>["caret_position_changed", "input_method_text_changed"],
> "key"=>["key_pressed", "key_released", "key_typed"],
> "mouse"=>
> ["mouse_clicked",
> "mouse_entered",
> "mouse_exited",
> "mouse_pressed",
> "mouse_released"],
> "mouse_motion"=>["mouse_dragged", "mouse_moved"],
> "mouse_wheel"=>["mouse_wheel_moved"],
> "property_change"=>["property_change"],
> "window"=>
> ["window_activated",
> "window_closed",
> "window_closing",
> "window_deactivated",
> "window_deiconified",
> "window_iconified",
> "window_opened"],
> "window_focus"=>["window_gained_focus", "window_lost_focus"],
> "window_state"=>["window_state_changed"]}> expected but was
> <{"component"=>
> ["component_resized",
> "component_moved",
> "component_shown",
> "component_hidden"],
> "container"=>["component_added", "component_removed"],
> "focus"=>["focus_gained", "focus_lost"],
> "hierarchy"=>["hierarchy_changed"],
> "hierarchy_bounds"=>["ancestor_moved", "ancestor_resized"],
> "input_method"=>["input_method_text_changed", "caret_position_changed"],
> "key"=>["key_typed", "key_pressed", "key_released"],
> "mouse"=>
> ["mouse_pressed",
> "mouse_released",
> "mouse_clicked",
> "mouse_exited",
> "mouse_entered"],
> "mouse_motion"=>["mouse_moved", "mouse_dragged"],
> "mouse_wheel"=>["mouse_wheel_moved"],
> "property_change"=>["property_change"],
> "window"=>
> ["window_opened",
> "window_closing",
> "window_closed",
> "window_iconified",
> "window_deiconified",
> "window_activated",
> "window_deactivated"],
> "window_focus"=>["window_gained_focus", "window_lost_focus"],
> "window_state"=>["window_state_changed"]}>.
>
> 2) Error:
> test_new_with_xml(TestDefaultTableModel):
> NativeException: java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
> java/util/Vector.java:432:in `elementAt'
> javax/swing/table/DefaultTableModel.java:622:in `getValueAt'
> sun.reflect.GeneratedMethodAccessor15:-1:in `invoke'
> sun/reflect/DelegatingMethodAccessorImpl.java:25:in `invoke'
> java/lang/reflect/Method.java:585:in `invoke'
> org/jruby/javasupport/JavaMethod.java:250:in `invokeWithExceptionHandling'
> org/jruby/javasupport/JavaMethod.java:219:in `invoke'
> org/jruby/javasupport/JavaClass.java:416:in `execute'
> org/jruby/internal/runtime/methods/SimpleCallbackMethod.java:67:in `call'
> org/jruby/internal/runtime/methods/AliasMethod.java:96:in `call'
> org/jruby/RubyObject.java:2050:in `send'
> org.jruby.RubyObjectInvoker$send_method_0_0:-1:in `call'
> org/jruby/runtime/CallSite.java:291:in `call'
> ruby/jit/ruby/usr/local/jruby_minus_1_dot_1_dot_3/lib/ruby/gems/$1_dot_8/gems/rubeus_minus_0_dot_0_dot_5_minus_java/lib/rubeus/extensions/javax/swing/j_table//usr/local/jruby-1.1.3/lib/ruby/gems/1.8/gems/rubeus-0.0.5-java/lib/rubeus/extensions/javax/swing/j_table.rb:44:in `__file__'
> org/jruby/internal/runtime/methods/DefaultMethod.java:138:in `call'
> org/jruby/RubyClass.java:243:in `invoke'
> org/jruby/javasupport/util/RuntimeHelpers.java:270:in `invoke'
> org/jruby/RubyObject.java:711:in `callMethod'
> org/jruby/javasupport/util/RuntimeHelpers.java:253:in `callMethodMissing'
> org/jruby/runtime/CallSite.java:235:in `callMethodMissing'
> org/jruby/runtime/CallSite.java:166:in `cacheAndCall'
> org/jruby/runtime/CallSite.java:435:in `call'
> org/jruby/ast/CallTwoArgNode.java:59:in `interpret'
> org/jruby/ast/FCallTwoArgNode.java:38:in `interpret'
> org/jruby/ast/NewlineNode.java:101:in `interpret'
> org/jruby/ast/BlockNode.java:67:in `interpret'
> org/jruby/internal/runtime/methods/DefaultMethod.java:171:in `interpretedCall'
> org/jruby/internal/runtime/methods/DefaultMethod.java:147:in `call'
> org/jruby/internal/runtime/methods/DefaultMethod.java:266:in `call'
> org/jruby/runtime/CallSite.java:147:in `cacheAndCall'
> org/jruby/runtime/CallSite.java:384:in `call'
> org/jruby/ast/FCallOneArgNode.java:36:in `interpret'
> org/jruby/ast/NewlineNode.java:101:in `interpret'
> org/jruby/ast/BlockNode.java:67:in `interpret'
> org/jruby/internal/runtime/methods/DefaultMethod.java:171:in `interpretedCall'
> org/jruby/internal/runtime/methods/DefaultMethod.java:147:in `call'
> org/jruby/RubyObject.java:2050:in `send'
> org.jruby.RubyObjectInvoker$send_method_0_0:-1:in `call'
> org/jruby/internal/runtime/methods/DynamicMethod.java:241:in `call'
> org/jruby/internal/runtime/methods/DynamicMethod.java:150:in `call'
> org/jruby/runtime/CallSite.java:381:in `call'
> ruby/jit/ruby/usr/local/jruby_minus_1_dot_1_dot_3/lib/ruby/$1_dot_8/test/unit/testcase//usr/local/jruby-1.1.3/lib/ruby/1.8/test/unit/testcase.rb:78:in `rescue_1$RUBY$__rescue__'
> ruby/jit/ruby/usr/local/jruby_minus_1_dot_1_dot_3/lib/ruby/$1_dot_8/test/unit/testcase//usr/local/jruby-1.1.3/lib/ruby/1.8/test/unit/testcase.rb:-1:in `ensure_1$RUBY$__ensure__'
> ruby/jit/ruby/usr/local/jruby_minus_1_dot_1_dot_3/lib/ruby/$1_dot_8/test/unit/testcase//usr/local/jruby-1.1.3/lib/ruby/1.8/test/unit/testcase.rb:76:in `__file__'
> org/jruby/internal/runtime/methods/DefaultMethod.java:278:in `call'
> org/jruby/runtime/CallSite.java:393:in `call'
> org/jruby/ast/CallOneArgBlockPassNode.java:60:in `interpret'
> org/jruby/ast/NewlineNode.java:101:in `interpret'
> org/jruby/runtime/InterpretedBlock.java:203:in `evalBlockBody'
> org/jruby/runtime/InterpretedBlock.java:154:in `yield'
> org/jruby/runtime/Block.java:100:in `yield'
> org/jruby/RubyArray.java:1338:in `each'
> org.jruby.RubyArrayInvoker$each_method_0_0:-1:in `call'
> org/jruby/runtime/CallSite.java:342:in `call'
> org/jruby/ast/CallNoArgBlockNode.java:63:in `interpret'
> org/jruby/ast/NewlineNode.java:101:in `interpret'
> org/jruby/ast/BlockNode.java:67:in `interpret'
> org/jruby/internal/runtime/methods/DefaultMethod.java:171:in `interpretedCall'
> org/jruby/internal/runtime/methods/DefaultMethod.java:147:in `call'
> org/jruby/internal/runtime/methods/DefaultMethod.java:287:in `call'
> org/jruby/runtime/CallSite.java:393:in `call'
> org/jruby/ast/CallOneArgBlockPassNode.java:60:in `interpret'
> org/jruby/ast/NewlineNode.java:101:in `interpret'
> org/jruby/runtime/InterpretedBlock.java:203:in `evalBlockBody'
> org/jruby/runtime/InterpretedBlock.java:154:in `yield'
> org/jruby/runtime/Block.java:100:in `yield'
> org/jruby/RubyArray.java:1338:in `each'
> org.jruby.RubyArrayInvoker$each_method_0_0:-1:in `call'
> org/jruby/runtime/CallSite.java:342:in `call'
> org/jruby/ast/CallNoArgBlockNode.java:63:in `interpret'
> org/jruby/ast/NewlineNode.java:101:in `interpret'
> org/jruby/ast/BlockNode.java:67:in `interpret'
> org/jruby/internal/runtime/methods/DefaultMethod.java:171:in `interpretedCall'
> org/jruby/internal/runtime/methods/DefaultMethod.java:147:in `call'
> org/jruby/internal/runtime/methods/DefaultMethod.java:287:in `call'
> org/jruby/runtime/CallSite.java:159:in `cacheAndCall'
> org/jruby/runtime/CallSite.java:396:in `call'
> org/jruby/ast/CallOneArgBlockPassNode.java:60:in `interpret'
> org/jruby/ast/NewlineNode.java:101:in `interpret'
> org/jruby/runtime/InterpretedBlock.java:203:in `evalBlockBody'
> org/jruby/runtime/InterpretedBlock.java:154:in `yield'
> org/jruby/runtime/Block.java:100:in `yield'
> org/jruby/RubyArray.java:1338:in `each'
> org.jruby.RubyArrayInvoker$each_method_0_0:-1:in `call'
> org/jruby/runtime/CallSite.java:342:in `call'
> org/jruby/ast/CallNoArgBlockNode.java:63:in `interpret'
> org/jruby/ast/NewlineNode.java:101:in `interpret'
> org/jruby/ast/BlockNode.java:67:in `interpret'
> org/jruby/internal/runtime/methods/DefaultMethod.java:171:in `interpretedCall'
> org/jruby/internal/runtime/methods/DefaultMethod.java:147:in `call'
> org/jruby/internal/runtime/methods/DefaultMethod.java:287:in `call'
> org/jruby/runtime/CallSite.java:393:in `call'
> org/jruby/ast/CallOneArgBlockPassNode.java:60:in `interpret'
> org/jruby/ast/NewlineNode.java:101:in `interpret'
> org/jruby/runtime/InterpretedBlock.java:203:in `evalBlockBody'
> org/jruby/runtime/InterpretedBlock.java:154:in `yield'
> org/jruby/runtime/Block.java:100:in `yield'
> org/jruby/RubyArray.java:1338:in `each'
> org.jruby.RubyArrayInvoker$each_method_0_0:-1:in `call'
> org/jruby/runtime/CallSite.java:342:in `call'
> org/jruby/ast/CallNoArgBlockNode.java:63:in `interpret'
> org/jruby/ast/NewlineNode.java:101:in `interpret'
> org/jruby/ast/BlockNode.java:67:in `interpret'
> org/jruby/internal/runtime/methods/DefaultMethod.java:171:in `interpretedCall'
> org/jruby/internal/runtime/methods/DefaultMethod.java:147:in `call'
> org/jruby/internal/runtime/methods/DefaultMethod.java:287:in `call'
> org/jruby/runtime/CallSite.java:159:in `cacheAndCall'
> org/jruby/runtime/CallSite.java:396:in `call'
> org/jruby/ast/CallOneArgBlockPassNode.java:60:in `interpret'
> ...
>
> もっと読む >>

秋間武志

unread,
Aug 31, 2008, 11:12:04 AM8/31/08
to rub...@googlegroups.com
重元さん

秋間です。

すいません、大ボケかましてました。
ビルドしないでテストしてどうするよ <俺 orz

# でもまた同じミスをするような気がするので、
# テストも自動でやれるようにしたいですね・・・

Failureになっていたものはsortを入れてちゃんと動くのを
確認しました!

という訳で、0.0.6 をリリースします!


2008/08/31 23:30 taka_2 <Takahiro....@gmail.com>:

Reply all
Reply to author
Forward
0 new messages