2

私は .NET の世界 (C#) から Java (Android 開発) に移行しています。

.NET スペースの多くのモッキング フレームワークとツールでは、テスト済みのメソッドにモック オブジェクトを挿入することなく、クラス/メソッドの使用を置換/オーバーライドできます ( Microsoft Fakesはその 1 つです)。

たとえば、次のメソッドを使用します。

public void SomeMethod()
{
     new SomeOtherClass().Do("This is a test!");
}

SomeOtherClass().Doメソッドを呼び出すと、このクラスのモック オブジェクトをこのメソッドに注入していなくても、特定の値を返したり、特定の方法で動作したりすることができます。

たとえば、 Microsoft Fakesを使用すると、これは次のようなコードで実行できます。

using (ShimsContext.Create())
{
      // decide what to do when Do() gets called
      System.Fakes.ShimSomeOtherClass.Do = str => ....

      new SomeOtherClass().Do("blabla");
}

Java/Android のモッキングの世界で私が見た限りでは、そのようなことは不可能です。すべてのメソッドに依存関係を挿入するには、すべてのコードをリファクタリングする必要があります。

これはいくつかの場所では実際に良い方法かもしれませんが、すべてのコードの場所で行うことは不可能です。

Javaでこれを達成する方法はありますか?

私が使用しているフレームワーク: Mockito、PowerMock、Robolectric

4

2 に答える 2

3

次を使用して、PowerMock で新しいオブジェクトのインスタンス化をモックできます。expectNew()

http://code.google.com/p/powermock/wiki/MockConstructor

SomeOtherClass someOtherMock = createMock(SomeOtherClass.class);
expectNew(SomeOtherClass.class).andReturn(someOtherMock);
expect(someOtherMock.do("blabla")).andReturn(...);

編集:PowerMockito拡張機能を備えたMockitoで使用できます

http://code.google.com/p/powermock/wiki/MockitoUsage

PowerMockito.whenNew(SomeOtherClass.class)...
于 2013-03-12T12:04:43.407 に答える
0

Mockitoがあなたが求めていることを実行すると確信しています。これが私のテストコードの一部です。

SnapshotManager snapshotManager = mock(SnapshotManager.class);
when(snapshotManager.storeBroadcast("MessageURL1", "B1")).thenReturn(new Distribution("AltMessageURL1", 1));

構文はより複雑ですが、動作は同じです。

storeBroadcastメソッドの文字列リテラルは文字列である必要はありません。値を制約するように設定することもできます。

さらに、値をスパイし、インスタンスをコードに挿入した後に期待されるメソッドが呼び出されたことを確認するオプションがあります。

于 2013-03-12T12:01:39.613 に答える