1

クラスの静的メソッドと非静的メソッドをモックしたい。私のソースは次のようになります。

    public class XDSUtilityManager
    {
private static XDSUtilityManager xdsUtilMgr = new XDSUtilityManager(); private XDSUtilityManager() { xdsUtilMgrImpl = new XDSUtilityManagerImpl(); }
public static XDSUtilityManager getInstance() { return (xdsUtilMgr == null ) ? new XDSUtilityManager() : xdsUtilMgr; } public XMLDocument getXMLDocument(final String absoluteKey, final XDSClient xdsClient) { return getXMLDocument(absoluteKey, xdsClient, false); } }

静的メソッドgetInstance()をモックしたい。getInstance() がXDSUtilityManagerクラスのモック オブジェクトを返すようにしたい。また、静的ではないgetXMLDocument()をモックしたいと考えています。

そして私のtestCaseでは、次のことを試しました:

XMLDocument xmlDocument = PowerMock.createMock(XMLDocument.class);
XDSUtilityManager xdsUtilityManager = PowerMock.createPartialMock(XDSUtilityManager.class,"getXMLDocument");
PowerMock.mockStaticPartial(XDSUtilityManager.class, "getInstance"); expect(XDSUtilityManager.getInstance()).andReturn(xdsUtilityManager).anyTimes();
expect(xdsUtilityManager.getXMLDocument((String)anyObject(), anyObject(XDSClient.class))).andReturn(xmlDocument).anyTimes();
PowerMock.replay(xdsUtilityManager); PowerMock.replay(xmlDocument);

しかし、物事は期待どおりに機能していません。助けてください

4

2 に答える 2

7

これを行う最も簡単な方法は、PowerMockitoを使用することです。PowerMockito は、Mockito と PowerMock を組み合わせたもので、静的オブジェクトのモックを作成できます。

私が使用したパターンは、静的モックを使用しgetInstance()て非静的モックのコピーを返し、それを通常どおり拡張することです。PowerMockitoを使用した例は次のとおりです。

@RunWith(PowerMockRunner.class)
@PrepareForTest({SingletonObject.class})
public class SingletonTester {
  @Mock
  private SingletonObject singleMock;

  @Before
  public void setup(){
      // initialize all the @Mock objects
      MockitoAnnotations.initMocks(this);
      // mock all the statics
      PowerMockito.mockStatic(SingletonObject.class);
  }

  @Test
  public void mockTester(){
      // Mock the static getInstance call to return the non-Static Mock
      Mockito.when(SingletonObject.getInstance()).thenReturn(singleMock);

      // Mock the non static version as normal
      PowerMockito.when(singleMock.nonStaticMethodCall()).thenReturn("Whatever you need.");
      //..........
  }
}

シングルトン オブジェクトを取得するための静的呼び出しgetInstance()は、インスタンス化されたモック オブジェクトを返します。何を返すかを静的に伝えたら、通常どおり非静的呼び出しをモックし続けることができます。

于 2013-03-19T20:24:33.813 に答える
1

getInstance()のインスタンスを作成するためにメソッドを呼び出す必要はありませんXDSUtilityManager。を使用するPowerMockitoと、コンストラクターはプライベートであるためsuppress the constructor、以下のように create mock を呼び出す前に行う必要があります。

PowerMockito.suppress(PowerMockito.constructor(XDSUtilityManager.class));
// enable static mocking for all the methods in the class   
PowerMockito.mockStatic(XDSUtilityManager.class); 
XDSUtilityManager xDSUtilityManager =  PowerMockito.mock(XDSUtilityManager.class);
XMLDocument xmlDocument = PowerMock.createMock(XMLDocument.class); 
PowerMockito.when(xDSUtilityManager.getXMLDocument(
    Mockito.anyString(),Mockito.anyObject())).thenReturn(xmlDocument);
于 2013-06-07T14:16:40.610 に答える