web-dev-qa-db-ja.com

Mockitoモックオブジェクトはnullを返します

私は、JSFアプリケーションと、mockitoを使用しているモックに対していくつかのテストを実装しようとしています。 (私も春を使用)

@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です。私はモックされたオブジェクトは初めてなので、この動作は正常ですか、それともコードに間違いがありますか?

20
flo8433

本当に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
       ...
    }
}
17
hoaz

使用することを忘れないでください

MockitoAnnotations.initMocks(this);

アノテーションを介してオブジェクトをモックしている場合、つまり@Mock Objectname

9
Swarit Agarwal

Mockito mocksへのすべてのメソッド呼び出しは、デフォルトでnullを返します。何かを返すようにしたい場合は、whenステートメントを介して返すように指示する必要があります。

次のように動作すると考えているようです... setInstanceを呼び出し、getInstancesetInstanceに渡された値を返すことを期待しています。 DAOは動作します。これがあなたがしようとしているものである場合、setInstanceはモックを返すように設定したものを返し、リレーションを持たないので、getInstanceを呼び出してgetInstanceをテストしないでください。 setInstanceに渡されたものに。代わりに、verifyを使用して、DAOの適切なメソッドがsetInstanceメソッドから呼び出されたことを検証します。

たとえば、GeneralConfigService.setInstanceGeneralConfigDAO.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));
}

また、genが(@Mockを介して)モックである場合、なぜgen = createGeneralConfigs...を介して他の何かに割り当てるのですか?

3
John B