9

dao.create()メソッドをテストするときにモックしたい呼び出しがあります。しかし、まだNPEを取得しているので、何かが足りません。ここで何が問題になっていますか?

class MyService {
    @Inject
    private Dao dao;

    public void myMethod() {
        //..
        dao.create(object);
        //
    }
}

dao.create()呼び出しをモックアウトするにはどうすればよいですか?

@RunWith(PowerMockRunner.class)
@PrepareForTest(DAO.class)
public void MyServiceTest {

    @Test
    public void testMyMethod() {
        PowerMockito.mock(DAO.class);

        MyService service = new MyService();
        service.myMethod(); //NPE for dao.create()
    }
}
4

5 に答える 5

5

DAOを注入していません。mockitoを使用すると、@InjectMocksとmockitorunnerを使用するようにテストクラスを変更できます。

@RunWith(MockitoJUnitRunner.class)
public void MyServiceTest {
    @Mock
    private Dao dao;
    @InjectMocks
    private MyService myService;
    ...
}

Inject Mocks APIで、InjectMocksの詳細を読むことができます。

より簡単な方法は、インジェクションをコンストラクターによるインジェクションに変更することです。たとえば、MyServiceを次のように変更します。

class MyService {
    ...
    private final Dao dao;

    @Inject
    public MyService(Dao dao) {
        this.dao = dao;
    } 
    ...
}

次に、セットアップでモックされたDAOに簡単に合格できるテストを行います。

...
@Mock
private Dao dao;

@Before
public void setUp() {
    this.dao = mock(Dao.class);
    this.service = new MyService(dao);
}
...

これで、次のように、が呼び出されverifyたかどうかを確認できます。create

...
   verify(dao).create(argThat(isExpectedObjectBeingCreated(object)));
}

private Matcher<?> isExpectedObjectBeingCreated(Object object) { ... }

Using injection by constructor will let your dependencies clearer to other developers and it will help when creating tests :)

于 2012-12-01T18:23:02.403 に答える
1

あなたはまだあなたのモックでダオフィールドを設定する必要があります。これにリフレクションを使用できます。

于 2012-11-30T12:49:45.387 に答える
1

モックオブジェクトDAOをサービスクラスに挿入/設定する必要があります。

春ベースのプロジェクトの場合は、@ SpringJunitTestrunnerをご覧ください。

于 2012-11-30T12:50:49.380 に答える
0

new MyService()Daoを使用する場合は、決して注入されません。ApplicationContextDao を注入するには、 (Spring) またはInjector(Guice)を介して MyService をロードする必要があります。通常のアプリケーションと同様です。

于 2012-11-30T12:51:31.407 に答える
0

他の人がすでに言ったように、何らかの方法でクラスにdaoフィールドを設定する必要があります。MyServiceテストの複合ランナーが Powermock と DI フレームワーク ランナーの両方を使用できるようにするメカニズムはわかりませんが (Powermock が必要であると仮定)、既に PowerMock を使用している限り (この例では理由が不明です) 、Whiteboxクラスを利用して、dao をより手動で設定できます。

public void testMyMethod() {
    Dao dao = mock(Dao.class)
    doNothing().when(dao).create(anyObject())); //assuming no return val for dao.create()

    MyService service = new MyService();
    Whitebox.setInternalState(service, "dao", dao);

    service.myMethod(); 
}
于 2012-12-01T17:57:46.113 に答える