[seasar-dotnet:1228] Re: Quill:QuillTestCaseでのエクセルデータの投入について質問

koyak [E-MAIL ADDRESS DELETED]
2008年 12月 17日 (水) 18:10:03 JST


小林さん

小谷です。

> [Seasar.Framework.Unit.S2FrameworkTestCaseRunner] DEBUG 2008-12-17 16:11:37,016 [10] 例外が発生しました。理由はSystem.Reflection.TargetInvocationException: 呼び出しのターゲットが例外をスローしました。 ---> System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
>   場所 Seasar.Extension.Unit.S2TestCase.get_CommandFactory()
>   場所 Seasar.Extension.Unit.S2TestCase.WriteDb(DataSet dataSet)

S2Containerが設定されていない状態でQuillTestCaseで動かした場合も
それを使ってDBへの書き込みを行おうとしていたためNullReferenceExceptionが
発生していました。

暫定的な対応になりますがQuillTestCaseを修正しました。
お手数ですがSubversionで最新のソースコード(revision:1084〜)を取得し、
コンパイルしたDLLを使ってご確認いただけないでしょうか。

以上、よろしくお願いします。


2008/12/17 17:02 小林貴生 <[E-MAIL ADDRESS DELETED]>:
> いつもお世話になっております。
> 小林(質問者)です。
>
>
> 現在、DBFlute をプロジェクトで使用するときに Quill で使用すべく
> 調査をさせていただいております。
>
> テスト時に、エクセルデータをDBに取り込もうと考えていたのですが、
> うまく行かなかったのでちょっと質問させて下さい。
>
>
> 環境
> s2container.net-1.3.13.zip
> dbflute-0.8.7.zip
>
>
> 現象
> ・diconファイルを用意して、S2TestCase を継承した場合はエクセルデータの取込出来るが
>  Quillの時には、エラーになってしまう。
>
>
> ファイル
> App.configファイル
>
> <?xml version="1.0" encoding="utf-8" ?>
> <configuration>
>  <configSections>
>    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
>    <section name="quill" type="Seasar.Quill.Xml.QuillSectionHandler, Seasar.Quill" />
>  </configSections>
>
>  <log4net>
>    <appender name="FileAppender" type="log4net.Appender.FileAppender">
>        ...(省略)
>  </log4net>
>
>  <quill>
>    <dataSources>
>      <dataSource name="TESTDB">
>        <provider>Oracle</provider>
>        <connectionString>"Data Source=TESTDB;User ID=TESTUSER;Password=TESTPASS"</connectionString>
>        <class>Seasar.Extension.Tx.Impl.TxDataSource</class>
>      </dataSource>
>    </dataSources>
>    <assemblys>
>      <assembly>System.Data.OracleClient, version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</assembly>
>    </assemblys>
>  </quill>
>
> </configuration>
>
>
> テストケースファイル(D_ACHIEVEと言うテーブルがあります。)
> using System.Collections.Generic;
> using MbUnit.Framework;
> using Seasar.Extension.Unit;
> using Seasar.Quill.Unit;
> using DBFluteTESTDB.ExBhv;
> using DBFluteTESTDB.ExEntity;
> using DBFluteTESTDB.CBean;
> using DBFluteTESTDB.Tests.Base;
>
> namespace SampI0010.Tests
> {
>    [TestFixture]
>    public class TestFixture1 : ContainerTestCase //:QuillTastCase  from example
>    {
>        protected DAchieveBhv _dAchieveBhv;
>
>        [Test, Quill(Tx.Rollback)]
>        public void Quillを使って取得してみるテスト()  //うまく通るテスト
>        {
>            DAchieveCB cb = new DAchieveCB();
>            IList<DAchieve> list = _dAchieveBhv.SelectList(cb);
>            //DB上には5件ある
>            assertEquals(5, list.Count);
>        }
>
>        [Test, Quill(Tx.Rollback)]
>        public void エクセルデータが読み込めるか()  //エラーになるテスト
>        {
>            ReadXlsAllReplaceDb("C:\\TESTDATA.xls");
>
>            DAchieveCB cb = new DAchieveCB();
>            IList<DAchieve> list = _dAchieveBhv.SelectList(cb);
>            //Excel内には9件ある
>            assertEquals(9, list.Count);
>        }
>
>    }
> }
>
>
> エラーメッセージ(上のテストは通りますが、下のテストで以下のエラーになります)
> [Seasar.Quill.QuillContainer] INFO  2008-12-17 16:11:36,666 [10] [IQLL0003]Quill設定ファイル(ある=true,なし=false):True
> [Seasar.Framework.Util.DataSourceUtil] DEBUG 2008-12-17 16:11:36,726 [10] 論理的なコネクションを取得しました
> [Seasar.Extension.Tx.Impl.TransactionContext] DEBUG 2008-12-17 16:11:36,736 [10] トランザクションを開始しました
> [Seasar.Extension.ADO.Impl.BasicUpdateHandler] DEBUG 2008-12-17 16:11:36,996 [10] DELETE FROM D_ACHIEVE
> [Seasar.Framework.Unit.S2FrameworkTestCaseRunner] DEBUG 2008-12-17 16:11:37,016 [10] 例外が発生しました。理由はSystem.Reflection.TargetInvocationException: 呼び出しのターゲットが例外をスローしました。 ---> System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
>   場所 Seasar.Extension.Unit.S2TestCase.get_CommandFactory()
>   場所 Seasar.Extension.Unit.S2TestCase.WriteDb(DataSet dataSet)
>   場所 Seasar.Extension.Unit.S2TestCase.ReadXlsAllReplaceDb(String path)
>   場所 SampI0010.Tests.TestFixture1.エクセルデータが読み込めるか() 場所 C:\solutions\TestSample\SampI0010\Tests\TestFixture1.cs:行 30
>   --- 内部例外スタック トレースの終わり ---
>   場所 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
>   場所 System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
>   場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
>   場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
>   場所 System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
>   場所 MbUnit.Core.TypeHelper.Invoke(MethodInfo method, Object o, IList args)
>   場所 MbUnit.Core.Invokers.MethodRunInvoker.InvokeMethod(Object o, IList args)
>   場所 MbUnit.Core.Invokers.MethodRunInvoker.Execute(Object o, IList args)
>   場所 Seasar.Quill.Unit.QuillTestCaseRunner.Run(IRunInvoker invoker, Object o, IList args)
> System.Reflection.TargetInvocationException: 呼び出しのターゲットが例外をスローしました。 ---> System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
>   場所 Seasar.Extension.Unit.S2TestCase.get_CommandFactory()
>   場所 Seasar.Extension.Unit.S2TestCase.WriteDb(DataSet dataSet)
>   場所 Seasar.Extension.Unit.S2TestCase.ReadXlsAllReplaceDb(String path)
>   場所 SampI0010.Tests.TestFixture1.エクセルデータが読み込めるか() 場所 C:\solutions\TestSample\SampI0010\Tests\TestFixture1.cs:行 30
>   --- 内部例外スタック トレースの終わり ---
>   場所 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
>   場所 System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
>   場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
>   場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
>   場所 System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
>   場所 MbUnit.Core.TypeHelper.Invoke(MethodInfo method, Object o, IList args)
>   場所 MbUnit.Core.Invokers.MethodRunInvoker.InvokeMethod(Object o, IList args)
>   場所 MbUnit.Core.Invokers.MethodRunInvoker.Execute(Object o, IList args)
>   場所 Seasar.Quill.Unit.QuillTestCaseRunner.Run(IRunInvoker invoker, Object o, IList args)
> [Seasar.Extension.Tx.Impl.TransactionContext] DEBUG 2008-12-17 16:11:37,026 [10] トランザクションをロールバックしました
> [Seasar.Framework.Util.ConnectionUtil] DEBUG 2008-12-17 16:11:37,036 [10] 論理的なコネクションを閉じました
>
>
> やったこと
> この条件で、App.config に Seasarセクションを用意して、
> エラーになるテストメソッドの所で
> [Test, S2(Tx.Rollback)]
> と属性を変更してやると、エクセルをちゃんと見つけてきてデータ投入してくれます。
>
> まあコネクションが違うので、[9]!=[5]となるのですが。
>
> ログを見るとエクセルファイルの読込時にエラーになっているみたいなのですが、何かパスの書き方が違うのでしょうか?。
> それとも何か違う設定方法があるのでしょうか?。
>
> 毎度毎度質問ばかりですいません。よろしくお願いいたします。
>
>
> 以上、よろしくお願いいたします。
>
> 小林貴生
>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


seasar-dotnet メーリングリストの案内