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