私たちのプロジェクトには、モジュール scout.client、scout.server、scout.shared、backend があります。
バックエンドには scout.server と scout.shared への依存関係はありませんが、scout.server にはバックエンドへの依存関係があります。
バックエンド プロジェクト内には、すべてのビジネス ロジックがあり、すべての外部サービスを呼び出しています。
私の問題は、バックエンドからいくつかのサービスを使用するスカウト サービスをテストしようとするときです。
scout は Bean をモックするための優れたツールを提供するため、バックエンド内のサービスを次のように Bean として定義しました。
BEANS.getBeanManager().registerClass(CarService.class);
BEANS.getBeanManager().registerClass(PartnerService.class);
CarService.class と PartnerService.class の両方がバックエンドにあります。
いくつかのテストを作成しようとして、 @BeanMock をテストのサービスに追加すると
@BeanMock
private IPartnerService partnerService;
私はモックを取得しますが、すべての関数を返すたびに、たとえ私が書いても、すべての関数はnullです
doReturn(PartnerBuilder.standardPartnerListWithOneElement()).when(this.partnerService)
.getPartners(any(Set.class));
テストでデバッグすると、このテストがデバッガーで呼び出される前に、次を取得できます。
partnerService.getPartners(...) -> return a list of person
正しいことですが、テストされたクラスがこのサービスを呼び出すと、null が返されます。
これは、 interface に注釈がないことが原因である可能性があることを理解しています@ApplicationScoped
。これがないと、1 つだけbean
が作成され、when
ステートメントがその Bean の別のコピーに反応するという保証はありません...?
バックエンドがスカウト モジュールに依存していないため、インターフェイスに注釈を追加できませんでした。
この種のケースをどのように処理できますか?
テストされたクラスは次のとおりです。
public class UtilityPartner {
/**
* Method return service bean for getting partners by ids.
*
* @return
*/
private static IPartnerService getPartnerService() {
return BEANS.get(IPartnerService.class);
}
public static String getPartnerName(final Long partnerId) {
if (partnerId == null) {
return "";
}
final List<Partner> partners =
(List<Partner>) getPartnerService().getPartners(Sets.newHashSet(partnerId));
if (partners == null || partners.isEmpty()) {
return "";
}
final Partner partner = partners.get(0);
return LookupUtil.createLookupDescription(partner.getId(), partner.getName());
}
}
テストクラスは次のとおりです。
@RunWith(ServerTestRunner.class)
@RunWithSubject("anonymous")
@RunWithServerSession(ServerSession.class)
public class TestUtilityPartner {
@BeanMock
private IPartnerService partnerService;
@Before
public void init() {
doReturn(PartnerBuilder.standardPartnerListWithOneElement()).when(this.partnerService).getPartners(any(Set.class));
}
@Test
public void getPartnerName() {
final String name = UtilityPartner.getPartnerName(10L);
Assert.assertEquals("My name", name); // NAME IS ""
}
}