2012-12-20 5 views
6

でJUnitのセットアップ方法と同様のものは、私は、このDAOインターフェイスのモックを作成して、私はDAOProcessと呼ばれるものにそれを送り、私は次のシナリオはMockito

interface DAO 
{ 
     String a(); 
     String b(); 
     String c(); 

} 

を持ってあります。 DAOプロセス内には、DAOメソッドa、b、cを呼び出すさまざまなメソッドがあります。

これで、DAoprocessでメソッドを単体テストする必要があるたびに、私は最終的にwhen(mockDAO.a()).thenReturn("test")と書きます。

とにかく、これらすべてのテストケースにこれらのwhen(mockDAO.a()).thenReturn("test")を共通化することはできますか?

答えて

9

テストケースは、すべて一つのクラスである場合は@Before、例えばアノテーションを付けるメソッドの使用を作ることができる:

... 
private DAO mockDAO; 

@Before 
public void setUp() { 
    mockDAO = mock(DAO.class); 
    when(mockDAO.a()).thenReturn("test"); 
    ...etc... 
}  
... 

多くのテストクラスで動作が必要な場合は、Mockインスタンスの動作を設定するユーティリティクラスを書くことができます。例えば、

public class MockDAOPrototype { 
    public DAO getMockWithDefaultBehaviour() { 
     final DAO mockDAO = mock(DAO.class); 
     when(mockDAO.a()).thenReturn("test"); 
     ...etc... 

     return mockDAO; 
    } 
} 

setUpメソッドでMockDAOPrototype.getMockWithDefaultBehaviour()を呼び出してください。

2

abstractというAbstractTestCaseクラスを作成し、このモックが必要なすべてのテストケースで拡張できます。その抽象的なテストケースでは、次のような記述があります。

あなたの具体的なテストケースクラスで
@Ignore // just in case your runner thinks this is a JUnit test. 
public abstract class AbstractTestCase 
{ 
     @Mock 
     private DAO mockDAO; 

     @Before 
     private void setupMocks() 
     { 
      when(mockDAO.a()).thenReturn("test") 
      .... 
     } 
} 

、あなたが考え

public class MyConcreteTestCase extends AbstractTestCase 
{ 
     @InjectMocks 
     @Autowired 
     private DAOProcess daoProcess; 

     .... 
} 
+0

私はここでAutowired注釈を使用しません。なぜなら、春のものと混乱するかもしれないからです。 DAOProcessがSpringのコンテキストで構築されていたとしても、私は、これらのビームはまだ春に管理されていますが、共同作業者の参照をモックで置き換えることは賢明です。 – Brice