2012-12-05 98 views
0

我想寫一個測試用例來驗證我的類中的方法。 我在我的方法中有一個本地ApplicationLauncher對象,因爲它調用方法launch(),因此它不得不被模擬,因爲它不應在單元測試中調用。模擬靜態方法

public class RunApp 
{ 
    public void check(String name) 
    { 
    if(name !=null) 
    { 
     ApplicationLauncher launcher = Application.getLauncher("launch"); 
     String appName = name+".bat"; 
     launcher.launch(appName); 
    } 
    } 
} 

我的JUnit測試代碼如下:

RunApp runapp = new RunApp(); 

@Mock 
ApplicationLauncher launcher; 

@Test 
public void test() 
{ 
    runapp.check("test"); 
    verify(launcher,atLeastOnce).launch(anyString()); 
} 

我無法返回像

when(Application.getLauncher(anyString())).thenReturn(launcher); 

模仿對象,因爲getLauncherApplication類的靜態方法。我該如何解決這個問題?

回答

3

更好的應用程序設計可能是將ApplicationLauncher作爲接口並創建生產和測試實現(或者只是模擬測試實現)。您需要將ApplicationLauncher的實例傳入您的RunApp類中,也許在構造函數中。

2

您可以使用PowerMock來嘲諷靜態方法,但是您應該檢查靜態方法調用是否真的有必要。

2

你可以重構你的班級,接受發射器被「注入」。

public class RunApp 
{ 
    public void check(String name) 
    { 
    check(name, Application.getLauncher("launch")); 
    } 

    protected check(String name, ApplicationLauncher launcher) { 
    if (name != null) 
    { 
     String appName = name + ".bat"; 
     launcher.launch(appName); 
    } 
    } 
} 

這樣你可以使用新的包保護check()方法來測試你的代碼使用假啓動器。

相關問題