2017-03-15 23 views
0

このAnswerの重複をマークする前に、その答えが私の問題を解決しないことを理解してください。答えは現在の方法でwhen()を使用する解決方法を示します。私の問題では、UserDaoが初期化されています。テスト中のメソッドとモックされたオブジェクトの内部をどこに渡すことはできません。MyBatisで初期化されたインターフェースの参照をモックする方法は?


MyBatisによって初期化されるインターフェイスの参照があります。オブジェクトがテストの対象に渡されないため、テストで直接模擬することはできません。私はコンストラクタを嘲笑してPowerMockする必要があります。インターフェイスを呼び出すコンストラクタは存在しないため、PowerMockは例外をスローします。ここで

java.lang.ArrayIndexOutOfBoundsException: 0 

    at org.powermock.api.mockito.internal.expectation.AbstractConstructorExpectationSetup.withAnyArguments(AbstractConstructorExpectationSetup.java:100) 

コードは、私がPowerMockせずにプログラムを実行すると、実際のデータベースにアクセスし、正しい結果を返している

class UserServiceTest{ 

    @AutoWired 
    UserService userService; 

    @Mock 
    UserDao userDao;//This is a reference to the interface (UserDao) which is mapped using MyBatis 

    @Before 
    public void setUp() throws Exception { 
      MockitoAnnotations.initMocks(this); 
      //The Program fails at the below statement 
      PowerMockito.whenNew(UserDao.class).withAnyArguments().thenReturn(userDao);   
    @Test 
    public void testFetchDetails() throws Exception { 
      when(userDao.fetchDetails(any(ParameterOne.class)).thenReturn(null); 
      assertThat(userService.fetchDetails(new ParameterOne())).isNull(); 
    } 

} 

どのように見えるかです。また、データベースにアクセスすると、Testのランタイムが500msまで遅くなります。

UserDao userDaoをどうすればよいですか?私がこのような場合に単体テストを行う方法を嘲笑することができなければ。テストしているコードを変更することはできません。

P.S. PowerMockの使用を避けるよう提案している場合は、この状況で「より良い」代替案を提案してください。

P.P.S私は、Daoレイヤーを使用するサービスではなく、Daoレイヤーをテストしていないので、サービスの動作が正しいかどうかをDaoLayerで調べる必要があります。

+0

あなたのテストの完全なコードですか? [docs](https://github.com/powermock/powermock/wiki/MockConstructor)に従って、テストに '@RunWith(PowerMockRunner.class)'と '@PrepareForTest(ClassThatCreatesTheNewInstance.class)'を注釈を付けるべきです。 。 – Morfic

答えて

0

アプリケーションはスプリングブートアプリケーションでした。テスト対象のクラスには@InjectMocksを使用し、モックを必要とするオブジェクトには@Mockを使用しました。

@RunWith(SpringRunner.class)  
class UserServiceTest{ 
    @InjectMocks 
    UserService userService; 

    @Mock 
    UserDao userDao;//This is a reference to the interface (UserDao) which is mapped using MyBatis 

    ... 
} 

これはうまくいきましたが、これはモックオブジェクトのwhen()/ given()を直接使用することができました。

関連する問題