2011-12-22 21 views
2

getData()模擬テスト中にネストされたメソッドのパラメータ 'param'をスパイする方法はありますか? Easymock 3で可能ですか?Easymockネストされたvoidメソッドのテスト(スパイ)

ソースコード

public class ServiceLogic { 

public void getData(){ 

    // some business logic 

    serviceDAO.executeStatement(param); 

} 

} 

Easymock試験:あるExecuteStatement()メソッドが正しいパラメータで呼び出されているかどうかをEasyMockに確認する方法

ServiceLogic _serviceLogicMock = EasyMock.createNiceMock(ServiceLogic.class); 
ServiceDAO _serviceDAOMock = EasyMock.createNiceMock(ServiceDAO .class); 

_serviceLogicMock.setServiceDAO(_serviceDAOMock); 

//some other method calls -> .execute(...).andReturn(...); 
EasyMock.replay(_serviceLogicMock); 

//run 
_serviceLogicMock.getData(); 

?!

+0

スパイはどういう意味ですか? serviceDAO.executeStatementが期待でき、paramの制約を与えることができます。 – aishwarya

+0

paramはどこにありますか?それをコンストラクタのServiceLogicに渡すことはできますか?またはセッターはありますか?もしあなたが使用できる場合はいつでも確認してください。 –

答えて

2

あなたのテストが間違っているように見えるん:

  • あなたのユニットテストは、なぜあなたはそれをあざけりんServiceLogicのテストについてですか?
  • ServiceDAOモックとのやり取りについても、あなたは期待していません。

質問がMockitoタグ付けされているように、私はあなたのコードに適応させることができ、以下の溶液(マイナス輸入)を提案する:テストを書くとき

@RunWith(MockitoJUnitRunner.class) 
public class ServiceLogicTest { 
    @Mock ServiceDAO serviceDAO; 
    @InjectMocks ServiceLogic serviceLogic; 

    @Test 
    public void ensure_executeStatement_is_called_with_right_param() throws Exception { 
     // given 
     String input = "Some input"; 

     // when 
     serviceLogic.getDataFrom(input); 

     // then 
     verify(serviceDAO).executeStatement("expected param"); 
    } 
} 

、私はBDD(ビヘイビアを使用したいです私がテストしたいものに私を導くスタイル)。私はあなたがそれを練習することをお勧めします、あなたはwiki pageを見ることができます。

verify行を調べると、モックが確認モードになるので、executeStatementというメソッドが実際に引数値"expected param"で呼び出されていることを実際に確認できます。

あなたがより複雑なパラメータを持っている場合は、あなたがHamcrestlibraryを使用して、いくつかの照合プログラムを使用することができます。

verify(serviceDAO).executeStatement(argThat(hasProperty("propertyName"))); 

それとも、FEST-Assert library(通常は私の好ましい方法)でMockitoのArgumentCaptor組み合わせて使用​​することができます。

ArgumentCaptor<ComplexArgument> argCaptor = ArgumentCaptor.forClass(ComplexArgument.class); 
verify(serviceDAO).executeStatement(argCaptor.capture()); 
assertThat(argCaptor.getValue()).isNotNull().satisfies(myComplexArgumentCondition()); 

主な考え方は、understandable codeをテストコードの生産コードにすることです。

詳細については、Mockito Javadocをご覧ください。

+0

+1はFEST-Assertライブラリの紹介です。私が好きで現在使用しているHamcrestの非常に興味深い選択肢。 – jhericks

0

これは、DAOに最終的な方法がない限り、jmockitで可能になります。しかし、これはjMockitで行われ、より良いと簡単です:

テストはアサーションを保存ほぼ完了です
@Test 
public void testMethod(@Mocked final ServiceDAO serviceDAO) { 
     new Expectations() {{ 
      serviceDAO.executeStatement(expectedOParams);returns(expectedReturnValue) 
     }}; 

    (new ServiceLogic(serviceDAO)).getData(); 
} 

。そして、それは最終的な、静的な、抽象的な、そしてどんな方法でも動作します。

2

@Briceと似ていますが、私はMockitoをEasyMockよりも好きですが、あなたの例がEasyMockだったので元の例に近いEasyMockバージョンがあります。

public class ServiceLogicTest { 

    @Test 
    public void ensure_executeStatement_is_called_with_right_param() throws Exception { 
     ServiceLogic _serviceLogicUT = new ServiceLogic(); 
     ServiceDAO _serviceDAOMock = EasyMock.createNiceMock(ServiceDAO .class); 

     _serviceLogicUT.setServiceDAO(_serviceDAOMock); 

     String input = "Some input"; 

     //some other method calls -> .execute(...).andReturn(...); 
     _serviceDaoMock.executeStatement("expected para"); // assuming a void method 
     EasyMock.replay(_serviceDaoMock);    
     // run 
     _serviceLogicUT.getDataFrom(input); 

     // verifies that the expected calls were made 
     EasyMock.verify(_serviceDaoMock); 
    } 
} 

EasyMockには引数取得機能もあります。それは次のようになります。

public class ServiceLogicTest { 

    @Test 
    public void ensure_executeStatement_is_called_with_right_param() throws Exception { 
     ServiceLogic _serviceLogicUT = new ServiceLogic(); 
     ServiceDAO _serviceDAOMock = EasyMock.createNiceMock(ServiceDAO .class); 

     _serviceLogicUT.setServiceDAO(_serviceDAOMock); 

     String input = "Some input"; 

     //some other method calls -> .execute(...).andReturn(...); 
     Capture<ComplexParam> capturedParam = new Capture<ComplexParam>(); 
     _serviceDaoMock.executeStatement(EasyMock.capture(capturedParam)); // assuming a void method 
     EasyMock.replay(_serviceDaoMock);    
     // run 
     _serviceLogicUT.getDataFrom(input); 

     ComplexParam actualParam = capturedParam.getValue(); 

     // make various assertions on actual param 
    } 
} 

私はあなたが多くの人々がMockitoを好む理由の二つの例から見ることができると思いますが、お好みやEasyMockを使用することを義務付けているいくつかの理由がある場合、あなたはあなたができる何でも単に行うことができますより多くのコード行で、Mockitoとやりましょう。

関連する問題