Mockitoは、はじめに:いくつかは、春モックオブジェクトがどのように

主婦

標準となりつつ分散アプリケーションの開発では、完全な垂直事業開発へのマイクロサービスチームは複数の常識となっています。上流と下流の依存関係とドッキングチームは正式な発展を入力するための良いインターフェースを重視した後、マイクロ・サービスは、チームは彼らのビジネスロジックに集中することができました。しかし、開発の各チームは、多くの場合、異なるリズム、下流のサービスに依存して、安定したサービスセルフテストを提供することはできません時々提供しました。複数のチームが、まだチームの全員との間に単一のモジュールの依存関係が存在することになるだけでなく、それはまた、このようなAの問題が存在している、責任があります。

この時間は、我々はコード内の依存サービスをシミュレートする必要があり、必ずコードの主な流れは、ポストに自分自身を開発するために行うことによって実行することができます。解放されると、下流のサービスに依存して、再度実際のサービスのテストで、アナログサービスを削除します。

最も古典を達成するためのフレームワークの一部に頼ることができますモックサービスがMockitoです。前モックの下流のサービスは直接ソースコードを変更するので、なぜ具体的には、最近のモックオブジェクトのメソッドを見て。例えば、ユーザ名、ユーザの年齢、ユーザーの性別を含む下流のサービスからの内容に基づいてユーザのユーザID情報を取得することになりました。ユーザー中心のサービスがリリースされていないので、しかし、私は直接ソースコード、仮想ユーザー情報のリターンを修正実現します。

public Interface UserService{
  UserInfo getUser(String userId);
}

public Class UserServiceImpl implements UserService() { @Autowired private UserCenter userCenter; @Override public UserInfo getUser(String userId) { //注释了对下游服务的访问 //return userCenter.getUser(userId); //创建了虚拟的用户信息并返回 UserInfo userInfo = new UserInfo(); userInfo.setUserName("xxx"); ... return userInfo; } }

その後、問題が来ました。セルフテストが完了した後、私は直接モックに提出したソースコードのコメントの内容はコードリポジトリを実装復元するのを忘れました。このサービスは、私が証明書利用者を呼び出すよりも多くあるので、主要な他の人は、このインターフェイスを呼び出すときに、ユーザーIDを変更する方法に関係なく、取得したユーザデータが同じであることがわかりました。その結果、私はサービスモックのソースコードを変更せずに、再びこのような問題を回避する方法を理解し始めました。

Mockito

MockitoのJavaのユニットテストは、最高速度モックフレームワークの一つです。それは簡潔な文法と完全なドキュメントを通じて多くの開発者を集めました。Mockitoは、導入や管理に依存するMavenとのGradleの使用をサポートしています。ここで与えられた例としては、唯一の依存性のMavenで導入します:

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <scope>test</scope>
        </dependency>

基礎として次の二つMockito JUnitフレームワークにおいて、詳細に記載されています

テストサービスする必要があります

依存サービス1、名前のメソッドは、名前を返します。

public interface ReliedService {

    String name(); } @Service public class ReliedServiceImpl implements ReliedService { @Override public String name() { return "rale"; } }

依存サービス2は、歓迎の方法は、歓迎のメッセージを返します。

public interface WelcomeLanguageService {

    String welcome(); } @Service public class WelcomeLanguageServiceImpl implements WelcomeLanguageService { @Override public String welcome() { return "wow"; } }

サービスDemoServiceをテストする必要があります。

public interface DemoService {

    String hello(); } @Service public class DemoServiceImpl implements DemoService{ private ReliedService reliedService; private WelcomeLanguageService welcomeLanguageService; @Override public String hello() { return welcomeLanguageService.welcome() + " " + reliedService.name(); } //之所以采用setter的方式进行依赖注入,是为了实现Mock对象的注入 @Autowired public void setReliedService(ReliedService reliedService) { this.reliedService = reliedService; } @Autowired public void setWelcomeLanguageService(WelcomeLanguageService welcomeLanguageService) { this.welcomeLanguageService = welcomeLanguageService; } }

モックオープン

方法1 Mockito.mock

Mockitoはサービスの例をシミュレートすることができ、直接模擬方法を提供しました。シミュレーションの完全な構文組換え法/ thenReturnなど。

import static org.mockito.Mockito.*;

@DelegateTo(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { Application.class })
public class MockDemo1 { private DemoService demoService; @Before public void before() { demoService = mock(DemoService.class); } @Test public void test() { when(demoService.hello()).thenReturn("hello my friend"); System.out.println(demoService.hello()); verify(demoService).hello(); } }

方法2。(この)MockitoAnnotations.initMocks

即ちMockitoAnnotations.initMocks(TestClassを)を使用して、最初の@Mockモック注釈オブジェクトを使用する場合、ここで達成されます。

@DelegateTo(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { Application.class })
public class MockDemo2 { @Mock private DemoService demoService; @Before public void before() { MockitoAnnotations.initMocks(this); } @Test public void test() { when(demoService.hello()).thenReturn("hello rale"); System.out.println(demoService.hello()); verify(demoService).hello(); } }

方法3 @RunWith(MockitoJUnitRunner.class)(推奨)

テストでこのコメントを入れた後、彼らは@Mockモックがそれにオブジェクトを自由に使用できます。

@RunWith(MockitoJUnitRunner.class)
@DelegateTo(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { Application.class })
public class MockDemo3 { @Mock private DemoService demoService; @Test public void test() { when(demoService.hello()).thenReturn("hello rale"); System.out.println(demoService.hello()); verify(demoService).hello(); } }

方法4 MockitoRule

場合MockitoRule言葉の使用、アクセスのレベルのオブジェクトがパブリックでなければならないことに留意すべきです。

@RunWith(JUnit4.class)
@DelegateTo(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { Application.class })
public class MockDemo4 { @Rule public MockitoRule rule = MockitoJUnit.rule(); @Mock private DemoService demoService; @Test public void test() { when(demoService.hello()).thenReturn("hello rale"); System.out.println(demoService.hello()); verify(demoService).hello(); } }

あなたが使用できない場合は、上記の4つの方法では、最も推奨される、第二の方法で@RunWith(MockitoJUnitRunner.class)時間をして、互換性のある他の方法を検討してください。

スタブ

スタブ規格は現在Mockito BDD(ビヘイビア開発駆動)に基づいて、単純な例上記において与えられているにも/ willReturn構文所与同様の考えを提供します。しかし、春は均等にIOCフレームワーク、およびMockitoの統合など、いくつかの問題があります。スタブ、手動で設定する必要が行なわ依存春豆の部分に必要であればそれは、あります。

Mockitoは実際には非常に便利な注釈が呼び出される提供し@InjectMocks、モックはコメントを自動的にテストセルを中にビーンに注入されたと宣言されることをオブジェクト。しかし、私は、ある問題の実験の過程で出会った@InjectMocksそれ以外の場合は例外がインタフェースを初期化できませんでしたスローされます、あなたがインターフェイス上でマークしたい場合は、インターフェイスを手動で初期化する必要があります。しかし、自動注射器の春を使用せず、手動でBeanに他の依存の注入で入力する必要があります。

したがって、現在使用されてMockitoの妥協点は、直接このインタフェースの@Autowire実装です。従属オブジェクトがまだスプリングビーンを使用して依存性注入宣言されていないながら上記InjectMocks注釈タグに、モックをテストするこの時点で自動的に、注入された宣言されたオブジェクト。

@RunWith(MockitoJUnitRunner.class)
@DelegateTo(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { Application.class })
public class InjectMockTest { @Mock private WelcomeLanguageService welcomeLanguageService; @Autowired @InjectMocks private DemoServiceImpl demoService; @Before public void before() { MockitoAnnotations.initMocks(this); given(welcomeLanguageService.welcome()).willReturn("hahaha"); } @Test public void test() { System.out.println(demoService.hello()); } }

DemoServiceで、WelcomeLanguageService使用モックオブジェクト、およびReliedServiceは自動的に春の豆を使用して注入します。

参考記事

Mockito公式文書

おすすめ

転載: www.cnblogs.com/exmyth/p/12535900.html