2012-07-30 50 views
1

我想做一個JUnit測試以確保某些類不使用特定的一組方法(來自其他類)。示例在Java中的方法內調用Get方法

class MyClass 
{ 
    void myMethod() 
    { 
     otherClass.otherClassStaticMethod(); 
    } 
} 

class myTest 
{ 
    void test() 
    { 
     assertFalse(CalledMethods.getMethodsCalledBy("myClass.myMethod").Contains("otherClass.otherClassStaticMethod")); 
    } 
} 

在此測試中,我想確保myMethod不調用otherClassStaticMethod。如何在編譯時查找在方法內部調用的方法(忽略使用反射調用的方法)?我想過一個.java解析器,你有什麼建議嗎?

+2

檢查方法調用通常用於確保在單元測試期間調用或不調用底層的某些方法。對於這個puupose你可以使用Mockito,EasyMock等。如果你想強制程序員不使用某個API,你應該考慮使用靜態代碼分析工具,如PMD或CheckStyle。 – 2012-07-30 13:11:54

回答

2

你可以模擬「otherClass」並驗證該方法未被調用。例如。使用Mockito你甚至可以指定以什麼順序調用哪些方法(在它們的實例是模擬的條件下)並指定哪些方法不允許被調用

作爲coding.mof表示,爲了模擬靜態方法應該使用PowerMock/PowerMockito:

例如:

PowerMockito.mockStatic(OtherClass.class); 

PowerMockito.verifyStatic(never()); 
OtherClass.otherClassStaticMethod(); 
+0

對於靜態方法,您需要Mockito的PowerMock擴展。 – 2012-07-30 13:05:30

1

這聽起來像你應該使用一個模擬庫,並讓這種處理這一切爲您服務。我推薦JMock作爲我選擇的圖書館。如果你正在使用實例方法,那麼這對你來說是完美的 - 如果你的例子顯示它是靜態方法,那麼PowerMock可能會工作* 1。

隨着JMock的,你必須是這樣的:

public class MyClass { 
    public MyClass(Dependency dependency) { 
     this.dependency = dependency; 
    } 

    void myMethod() { 
     dependency.someMethod(); 
    } 
} 

@RunWith(JMock.class) 
public class MyTest { 
    private Mockery context = new Mockery(); 

    @Test 
    public void doesNotCallSomeMethod() { 
     Dependency dependency = context.mock(Dependency.class); 
     MyClass obj = new MyClass(dependency); 

     obj.myMethod(); <--- this will fail fast 
    } 
} 

當你調用obj.myMethod,JMock的將立即報告,你從來沒有說過的依賴應該有所謂的任何方法。它還會告訴你,你要叫什麼方法,什麼參數,你傳遞如有

* 1我不使用PowerMock我脫離過往的靜態方法消失,除非它們是純函數