2013-05-15 80 views
17

ちょっと私のjsfアプリケーションとモックのいくつかのテストを実装しようとしています。私はmockitoを使っています。 (私も春を使用)Mockitoモックオブジェクトがnullを返す

@RunWith(MockitoJUnitRunner.class) 
public class GeneralConfigServiceImplTest { 

    private GeneralConfigService generalConfigService; 

    @Mock 
    private GeneralConfigDAO generalConfigDAO; 

    @Mock 
    private GeneralConfig gen; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
     generalConfigService = new GeneralConfigService(); 
     ReflectionTestUtils.setField(generalConfigService, "generalConfigDAO", generalConfigDAO);     
    } 

    @Test 
    public void testAddGeneralConfigCallDAOSuccess() throws DAOException, EntityNullException, IllegalEntityArgumentException, ParseException, EntityPersistException { 
     gen = createGeneralConfigs("label", "value"); 

     generalConfigService.setInstance(gen); 
     generalConfigService.persist(); 
     log.info(generalConfigService.getInstance().toString()); 
    } 
} 

テストは成功しますが、私はgetInstanceメソッドでインスタンスを取得したい場合。前にコンストラクタを介して設定したすべてのパラメータはnullです。 私は嘲笑されたオブジェクトに慣れていないので、この動作は正常ですか、またはコードに間違いがありますか?

+0

これは、問題のオブジェクトをモックしないので、モッキングに関連しているようには見えません。 –

答えて

14

本当にGeneralConfigService#getInstance()の実装に依存します。また、@InjectMocksアノテーションを使用すると、テストコードを大幅に簡素化できます。

あなたはモックを初期化し、手動で依存関係を注入する必要はありませんMockitoJUnitRunnerを使用して:

@RunWith(MockitoJUnitRunner.class) 
public class GeneralConfigServiceImplTest { 

    @InjectMocks 
    private GeneralConfigService generalConfigService; 

    @Mock 
    private GeneralConfigDAO generalConfigDAO; 

    @Test 
    public void testAddGeneralConfigCallDAOSuccess() { 
     // generalConfigService is already instantiated and populated with dependencies here 
     ... 
    } 
} 
+0

https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/ –

3

すべての方法はMockitoモックの呼び出しは、デフォルトではnullを返します。それ以外のものを返すには、whenステートメントでそれを伝える必要があります。

あなたはsetInstanceに電話をして、に渡された値を返すと期待しています。これはDAOの仕組みなので、setInstanceに渡されました。これがあなたが試みているものなら、getInstanceを呼び出すことによってsetInstanceをテストするべきではありません。getInstanceは返されるモックを返すので、setInstanceに渡されたものとは関係ありません。代わりに、verifyを使用して、DAOの適切なメソッドがsetInstanceメソッドから呼び出されたことを検証します。 genは、なぜあなたはgen = createGeneralConfigs...

を経由して他の何かにそれを割り当てる( @Mock経由)モックがある場合たとえば

GeneralConfigService.setInstance通話 GeneralConfigDAO.setInstanceは、あなたのテストは次のようになります場合は...また

@Test 
public void testAddGeneralConfigCallDAOSuccess() throws DAOException, EntityNullException, IllegalEntityArgumentException, ParseException, EntityPersistException { 
gen = createGeneralConfigs("label", "value"); 

generalConfigService.setInstance(gen); 
generalConfigService.persist(); 

verify(genConfigDAO).setInstance(sameInstance(gen)); 
} 

6

あなたがオブジェのモックいる場合

MockitoAnnotations.initMocks(this); 

を使用することを忘れないでください。 ct(注釈)@Mock Objectname

+1

initMocksは必須ではありません。 Mockito JUnitランナーを使用します。 –

+0

コメントありがとうございます。いずれにせよ私は信じている... –

+0

今日私はメインクラスでモックを使用しています。いや〜 – Tiina

関連する問題