CDI を使用したプロジェクトがあり、モックを使用して単体テストを作成したいと考えています。モックを管理するには EasyMock を使用し、CDI で実行するには、使いやすいと思われる cdi-unit プロジェクトを見つけました。
CDI コンテキストで EasyMock を使用してモックを取得するのに問題があります。これが私の単体テストです:
@RunWith(CdiRunner.class)
@AdditionalClasses(MockFactory.class)
public class ResultYearMServiceImplTest {
@Inject
private IStockDao stockDao;
@Inject
private ResultYearMServiceImpl resultYearMService;
@Test
public void getResultList() {
EasyMock.reset(stockDao);
EasyMock.expect(stockDao.getListStocks()).andReturn(null).once()
.andReturn(new ArrayList<DtoStock>()).once();
EasyMock.replay(stockDao);
}
}
IStockDao はテストでモックにする必要があるため、それを取得するには、次のような @Produces メソッドを使用したいと思います (@AdditionalClasses によって cdi ユニットに与えられた MockFactory クラスで):
@Produces
@ApplicationScoped
public IStockDao getStockDao() {
return EasyMock.createMock(IStockDao.class);
}
単体テストを実行すると、モックは単体テストに適していますが、次のエラーが発生します。
java.lang.IllegalArgumentException: モックではありません: org.jboss.weld.proxies.IStockDao$-1971870620$Proxy$_$$_WeldClientProxy
これは、CDI が EasyMock IStockDao のインスタンスを提供するのではなく、プロキシ化されたインスタンスを提供し、EasyMock がこれらのメソッド (reset メソッドなど) でこれを受け入れないために発生します。
したがって、MockFactory の @ApplicationScoped をインスタンスをプロキシしない @Dependent に置き換えますが、新しい問題があります。
この注釈は、各インジェクション ポイントでモックの新しいインスタンスを提供するので、単体テストにモックを使用して、テスト対象のクラスで呼び出されるメソッドをモックするため、それを使用できます。そして、モックのこのインスタンスは、テストされたクラスで同じでなければなりません (@Dependent の場合はそうではありません)。
単体テストとテスト済みクラスで同じインスタンスを取得するにはどうすればよいですか?
ありがとう。