2016-03-21 3 views
1

私たちのプロジェクトでは、モジュールscout.client、scout.server、scout.shared、バックエンドがあります。Eclipseスカウトネオンモックバックエンドサービス

バックエンドはscout.serverおよびscout.sharedに依存しませんが、scout.serverはバックエンドに依存します。

enter image description here

バックエンドのプロジェクトの中に、私はすべてのビジネスロジックを持っており、すべての外部サービスを呼び出します。

私の問題は、バックエンドのサービスを使用するスカウトサービスをテストしようとするときです。

スカウトが豆をあざけるためのいくつかの素晴らしいツールを提供しているので、私たちのように豆とバックエンドの内側に当社のサービスを定義した:

BEANS.getBeanManager().registerClass(CarService.class); 
BEANS.getBeanManager().registerClass(PartnerService.class); 

どちらも、CarService.classとPartnerService.classはバックエンドです。

私はいくつかのテストを書いてみると、私はテストで

@BeanMock 
private IPartnerService partnerService; 

にサービスを提供するために@BeanMockを追加すると、私はモックを得るが、その後、すべては私が

doReturn(PartnerBuilder.standardPartnerListWithOneElement()).when(this.partnerService) 
    .getPartners(any(Set.class)); 
を書く場合でも、すべての機能がnullを返します

このテストはデバッガと呼ばれる前に、私は、私のテストでデバッグする場合、私は得ることができます:

partnerService.getPartners(...) -> return a list of person 

右が何でありますか、テスト対象のクラスがこのサービスを呼び出すときはnullを返します。

これは、インタフェース@ApplicationScopedの注釈がないことが原因である可能性があると私は理解します。これがなければ、beanが1つしか作成されておらず、whenステートメントがそのBeanの別のコピーに反応するという保証はありません...?

backendはスカウトモジュールに依存しないため、インタフェースに注釈を追加できませんでした。

このようなケースをどうすれば処理できますか?


テスト済みクラスです:

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 "" 
    } 
} 

答えて

1

私はスカウトアーキテクチャ文書でbean registrationを参照してください(あなたがBeanマネージャでは、あなたのモックインスタンスを登録する必要があることだと思います)。モックが生産的な登録を勝ち取るためには小さな注文(-10 000 is recommended for tests)を使うべきです。最良の方法はTestingUtilityクラスを使用してモックを登録/登録解除することです。私は@BeanMockorg.eclipse.scout.rt.testing.platform.mock.BeanMock)がやっているかわからないけど、Judith Gull's answerによると、それは動作しません

import java.util.Collections; 

import org.eclipse.scout.rt.platform.BeanMetaData; 
import org.eclipse.scout.rt.platform.IBean; 
import org.eclipse.scout.rt.testing.shared.TestingUtility; 
import org.junit.After; 
import org.junit.Assert; 
import org.junit.Before; 
import org.junit.Test; 
import org.mockito.Mockito; 

public class TestUtilityPartner { 

    private IBean<?> beanRegistration; 

    @Before 
    public void init() { 
     partnerService = Mockito.mock(IPartnerService.class); 

     // Register the mock using the Bean meta information: 
     BeanMetaData beanData = new BeanMetaData(IPartnerService.class) 
      .withInitialInstance(partnerService) 
      .withApplicationScoped(true); 
     this.beanRegistration = TestingUtility.registerBean(beanData); 


     // Mockito behavior: 
     Mockito.doReturn(Collections.singletonList(new Partner(34L, "John Smith"))) 
      .when(partnerService).getPartners(Mockito.any(Set.class)); 
    } 

    @After 
    public void after() { 
     // Unregister the mocked services: 
     TestingUtility.unregisterBean(this.beanRegistration); 
    } 

    @Test 
    public void getPartnerName() { 
     String name = UtilityPartner.getPartnerName(10L); 
     Assert.assertEquals("10 - John Smith", name); 
    } 
} 

:(@Afterでアノテート方法で)unregisterBean()メソッドを呼び出すことを忘れないでください

@BeanMockを使用すると、アプリケーションスコープのサービスを使用していないため、ここでは役に立ちません。

ローカルメソッドのpartnerServiceを変更しています。ただし、テストでは、新しいインスタンス(BEANS.get(IPartnerService.class))を作成しているUtilityPartner.getPartnerServiceを呼び出します。

@BeanMockは、アプリケーションスコープBeanをモックするために便利です。ローカルフィールドpartnerServiceを変更しているinitメソッドでは

:あなたがアプリケーションを使用していないので、ここでは解決しない@BeanMockを使用して

+0

うわーこの作品!私は追加の質問があります:あなたが私のbean(テストではなくPlatformListener)を登録するときにここに投稿したようにBEANを登録する方が良いでしょうか? –

+0

私はコメントでこれに答えることはできません。 2番目の質問を他のスレッドに移す:http://stackoverflow.com/questions/36164077/scout-bean-manager-registerclass-or-registerbean – Jmini

+1

私は、この例を 'TestingUtility'を使って更新しました。コードを更新する必要があります。 – Jmini

2

は、サービスをスコープ。ただし、テストでは、新しいインスタンス(BEANS.get(IPartnerService.class))を作成しているUtilityPartner.getPartnerServiceを呼び出します。

@BeanMockは、アプリケーションスコープBeanをモックするために便利です。

いつも豆を手動で登録することができますas shown by Jmini。テスト後にBeanの登録を忘れることを忘れないでください!

org.eclipse.scout.rt.testing.shared.TestingUtility.registerBean(BeanMetaData)を使用することをおすすめします。これは自動的にテスト注文を追加し、@TunnelToServer個の注釈を削除します。

関連する問題