2017-02-17 35 views
0

我想單元測試使用EasyMock的類。爲了簡化,我在下面做了一個例子。我想要的是在測試期間將StringBuilder實例替換爲EasyMock實例。 (因爲它不是我想要測試的StringBuilder的功能。)不幸的是,這在下面的例子中不起作用。在其他測試中,我通過使用EasyMock實例設置實例變量來解決問題,但對於此示例,我無法執行此操作,因爲它是我關心的本地實例化對象。如何用Easymock替換我的實例

誰能幫我一把嗎?

類來進行測試:

package example.easymock 

public class Example { 

    public String exampleMethod() { 
     StringBuilder string = new StringBuilder(); 
     string.append("hello"); 
     return string.toString(); 
    } 
} 

測試類:

package example.easymock 

import needed classes 

public class ExampleTest { 

    @Test 
    public void exampleMethodTest() { 
     StringBuilder stringMock = EasyMock.createMock(); 
     Example example = new Example(); 
     stringMock.append("hello"); 
     EasyMock.expect(stringMock.toString()).andReturn("hi"); 

     EasyMock.replay(stringMock); 

     example.exampleMethod(); 
    } 
} 

回答

2

只需使用EasyMock這將是不可能的。 PowerMock確實包含這動力然而要做到:

expectNew(StringBuilder.class).andReturn(stringMock); 

您需要爲正確設置PowerMock配置,當然工作 - 看到更多的here

這並不能改變一個事實,那正是這種不可能性(部分)導致廣泛採用Inversion of Control作爲設計原則。另外,通常情況下,您無法測試的任何方法都是可以重構爲更好(可測試)的方法。 PowerMock應該只用於測試代碼本身不能改變時更好。

這當然假設StringBuilder只是一個例子,而不是字面上你想要做的。如果是 - 不要打擾,那麼可以假定任何屬於語言庫的方法都是按廣告方式工作的。

+0

PowerMock實際上可以模擬類的構造函數。所以它*可能與PowerMock。 – dav1d

+0

@ dav1d該死的,那件事情是強大的,真實的。 – Deltharis

+0

只需添加如何使用TestNG + PowerMock + Mockito進行測試就很有幫助:準備要測試的類:''@PrepareForTest(SomeService.class)''然後只是「構造函數」:'whenNew(Date 。的.class).withNoArguments()thenReturn(現在);' – dav1d