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

小林貴生 [E-MAIL ADDRESS DELETED]
2008年 12月 17日 (水) 17:02:16 JST


いつもお世話になっております。
小林(質問者)です。


現在、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 メーリングリストの案内