Index: [Article Count Order] [Thread]

Date:  Wed, 24 Jul 2002 12:09:00 +0900
From:  NAKAGUCHI Takao <takao-n@....jp>
Subject:  [XP-jp:03595] Re: AspectJ+MockObject
To:  extremeprogramming-jp@....jp
Message-Id:  <3D3E1A4C.F1D15D2C@....jp>
References:  <87adoi6d7a.fsf@....jp> <200207240032.JAA18188@....jp>
X-Mail-Count: 03595

中口です。


石井 勝 wrote:
> つまり,実装クラス Foo のテストについて,テストメソッド testA では
> MockFooA クラスという MockObject, テストメソッド testB では MockFooB
> クラスという MockObject がほしい場合,AspectJ では対応できないのでは
> ないかと.AspectJ では,すでにフックされている Foo クラスが実体として
> あるわけですから.

こういうことでしょうか。

public aspect CallReplacement{
  pointcut callToGetCustomer():
    call(Customer Manager.getCustomer());

  pointcut InTestA():
    cflow(execution(public void ManagerTest.testA()));

  pointcut InTestB():
    cflow(execution(public void ManagerTest.testB()));

  Object around(): callToGetCustomer() && InTestA(){
    return new MockObjectA();
  }

  Object around(): callToGetCustomer() && InTestB(){
    return new MockObjectB();
  }
}

同じメソッドが対象でも、特定のフロー(cflow)によって pointcut を切り替える
ことができます。

また、

public aspect CallReplacement{
  pointcut callToGetCustomer():
    call(Customer Manager.getCustomer());

  pointcut InTestA():
    cflow(execution(public void ManagerTest.testA()));

  pointcut InTest():
    cflow(execution(public void ManagerTest.test*()));

  Object around(): callToGetCustomer() && InTestA(){
    return new MockObjectA();
  }

  Object around(): callToGetCustomer() && InTest(){
    return new MockObjectB();
  }
}

こんな感じで、testA だけは MockObjectA を、他のテストメソッド(test*) では
MockObjectB を返すようにすることもできます。


NAKAGUCHI Takao
takao-n@....jp