11

Spring オートワイヤリングを使用してインターフェースのインスタンスである依存関係を注入するクラスの JUnit テストを作成しています。テスト中のクラスは、依存関係を明示的にインスタンス化したり、コンストラクターに渡したりすることは決してないため、JMockit もそれをインスタンス化する義務を感じていないようです。

これまで、SpringRunner を使用して Spring ロードのモック依存関係を使用してきましたが、これは機能します。これについて私たちが気に入らない 2 つの点は、1) テストを実行するたびに Spring フレームワークをロードして初期化する必要があり、正確に高速ではないこと、および 2) すべてのモック依存関係を実際のクラスとして明示的に作成する必要があることです。 JMockit は排除に役立ちます。

以下は、テストしているものの簡単な例です。

public class UnitUnderTest {

   @Autowired
   ISomeInterface someInterface;

   public void callInterfaceMethod() {

      System.out.println( "UnitUnderTest.callInterfaceMethod calling someInterface.doSomething");
      someInterface.doSomething();
   }

}

では、問題は、JMockit にモックを作成させる方法はあるのsomeInterfaceでしょうか?

4

5 に答える 5

12

JMockit は常にモックされたインターフェースをインスタンス化しますが (最終的なモック フィールドの場合を除く)、それはテスト コードでのみ発生します。インスタンスをテスト中のコードに自動的に挿入することはありません。

モック インスタンスを手動で注入する必要があります。例えば:

public class SomeTest
{
   @Autowired UnitUnderTest unitUnderTest;
   @Mocked ISomeInterface theMock; // created and assigned automatically

   @Test
   public void testSomeMethod()
   {
      Deencapsulation.setField(unitUnderTest, theMock);
      //proceed with unit test here
   }
}

mockit.Deencapsulationは、プライベート メソッド、get/set フィールドなどを呼び出すことができる Reflection ベースのユーティリティ クラスです。

于 2010-01-02T17:08:41.597 に答える
8

テストケースにorg.springframework.test.util.ReflectionTestUtilsモックを明示的に挿入するために使用できます。ISomeInterface

ドキュメントを参照してください

于 2009-12-30T15:17:27.173 に答える
4

上で親切に提供されたヒントを使用して、JMockit にかなり慣れていない人として私が最も役立つと思ったものを次に示しますDeencapsulationMockUpインターフェイスの実装を明示的に作成し、インターフェイスの 1 つ以上のメソッドをモックできます。この特定のケースを解決する方法は次のとおりです。

@Before
public void setUp() {

   IMarketMakerDal theMock = new MockUp <IMarketMakerDal>() {

      @Mock
      MarketMakerDcl findByMarketMakerGuid( String marketMakerGuid ) {

         MarketMakerDcl marketMakerDcl = new MarketMakerDcl();
         marketMakerDcl.setBaseCurrencyCode( CURRENCY_CODE_US_DOLLAR );
         return marketMakerDcl;
      }
   }.getMockInstance();

   setField( unitUnderTest, theMock );
}

助けてくれてありがとう。

于 2010-01-03T15:41:08.380 に答える
3

出会った人へ

java.lang.IllegalStateException: Missing @Injectable for field *** 

また

java.lang.IllegalStateException: Missing @Tested class for field ***

( または) フレームワークでフィールドjmockitをモックするために使用するときにエラーが発生しました。上記のエラーを回避するために、以下の 2 つの手順を実行しました。@autowiredspringspring boot

  1. @Tested(fullyInitialized=true)の代わりに使用@Tested

https://groups.google.com/forum/#!msg/jmockit-users/uo0S51lSX24/lQhLNN--eJcJ

  1. jmockit のバージョンを1.18以前のバージョンに戻す

https://groups.google.com/forum/#!topic/jmockit-users/wMFZggsA8LM

于 2016-11-01T09:57:01.700 に答える