|
|
特集
.NET開発者のためのDI&AOP入門(前編)
Seasar.NETでDIを始めよう
株式会社アイビス 杉本 和也
2007/12/10 |
 |
|
●2-3. DIが役立つ場面
その例の1つとして単体テストが挙げられる。
単体テスト時には、実際にデータベースを書き換えたくないといった理由により実装クラスをモック・クラス(=疑似的な動作を行うクラス)に置き換えたい場合がある。そんなとき、Quillは単体テスト時にモック・クラスに切り替える仕組みを持っているので便利だ。
例えば、EmployeeDaoクラスを単体テスト時にMockEmployeeDaoクラスに置き換えたい場合は、IEmployeeDaoインターフェイスにMock属性(Seasar.Quill.Attrs名前空間)を設定してモック・クラスを指定しておき、テスト・コードではQuillInjectorの代わりにMockInjector(Seasar.Quill.Unit名前空間)を使用してDIを行う。その場合のソース・コードは以下のようになる。
なお、テストを記述している以下のEmployeeLogicTestクラスでは、テスティング・フレームワークとしてMbUnitを使用している。テスティング・フレームワークについては各自使い慣れたものを使えばよいが、もしS2Containerを使う場合は、単体テストをサポートするS2Unit.NETが便利だ。S2Unit.NETはMbUnitを拡張してDIコンテナを用いたテストを助けてくれる。
namespace QuillSample
{
/// <summary>
/// 単体テスト時に使用するIEmployeeDaoのMockクラス
/// </summary>
public class MockEmployeeDao : IEmployeeDao
{
public string GetEmpName(int empNo)
{
return "テスト 太郎";
}
}
}
|
|
MockEmployeeDaoクラスのソース・コード(MockEmployeeDao.cs) |
using Seasar.Quill.Attrs;
namespace QuillSample
{
[Mock(typeof(MockEmployeeDao))]
[Implementation(typeof(EmployeeDao))]
public interface IEmployeeDao
{
……省略…… |
|
IEmployeeDaoインターフェイスのソース・コード(IEmployeeDao.cs) |
using MbUnit.Framework;
using Seasar.Quill.Unit;
namespace QuillSample
{
[TestFixture]
public class EmployeeLogicTest
{
protected IEmployeeLogic empLogic;
[Test]
public void TestGetEmpNameWithTitle()
{
MockInjector.GetInstance().Inject(this);
string empName = empLogic.GetEmpNameWithTitle(123);
Assert.AreEqual("テスト太郎さん", empName);
}
}
}
|
|
EmployeeLogicTestクラスのソース・コード(EmployeeLogicTest.cs) |
ほかにもDIが有効なケースとして、業務アプリケーションの納品先によって少しだけロジックを変えたいというようなことがあるかもしれない。Quillでは標準でそのような機能は持っていないが、Quillは非常にシンプルなソース・コードで作成されているため、カスタマイズが容易である。
例えばImplA属性とImplB属性といった属性を作成しておき、設定ファイルなどの設定値を基に「ImplA属性で指定された実装クラスか」「ImplB属性で指定された実装クラスか」を切り替えるようなInjectorクラスを作成することができる。先ほど出てきたMockInjectorクラスはQuillInjectorのカスタマイズのよいサンプルなので参考にしてほしい。
また、S2Containerを使えば、設定ファイルでDIの設定を行うため、設定ファイルを切り替えることでそのような要件を標準で満たすことができる。
■
以上がS2Container.NETのQuillによるDIの基礎である。引き続き、次回後編ではAOPについての概要を説明する。
Insider.NET 記事ランキング
本日
月間