2014-12-30 115 views
0

嗨我請求你的幫助,知道如何模仿類Validator.validateConnection();的方法。 問題是方法validateConnection不存在Class_Implementation類中,我不想在類Class_Implementation中創建該方法。方法validateConnection與數據庫建立連接以確定連接是否處於活動狀態。當Mockito運行時,我得到一個java.Lang.NullPointerException,這是由NamingException造成的 - 需要在環境中指定類名。Mockito另一個類的對象方法

真正的問題是,當我在打電話測試的Mockito行:

Boolean resp = mockImpl.checkConnection(); 

..in的checkConnection()Validator.validateConnection();試圖連接到數據庫。我只是想效仿這一行並返回truefalse,但問題是方法validateConnection()是類Validator的一個實例。

如果需要更多的信息來解決這個問題,請讓我知道。

public class Class_Implementation { 

    public boolean checkConnection() { 
     boolean isConnectionAlive = false; 

     Validator.validateConnection(); 

     // another things for do 

     return false; 
    } 

} 

public class Validator { 

    public static Boolean validateConnection() { 
     Connection conn = new Connection(); 

     Boolean connectionAlive = false; 
     connectionAlive = conn.isConnectionAlive(); 

     if (connectionAlive) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

} 

public class Connection { 

    public boolean isConnectionAlive() { 
     // Code for connection to DB 
    } 

} 

// class for do the test 
@RunWith(PowerMockRunner.class) 
@PrepareForTest({Class_Implementation.class,Validator.class}) 
public class TestConnection { 

    @Test 
    public void validate_Connection() throws Exception { 
     Class_Implementation mockImpl = PowerMock.createPartialMock(Class_Implementation.class); 

     PowerMock.mockStatic(Validator.class); 

     PowerMockito.when(mockImpl, Validator.validateConnection()).thenReturn(true); 

     PowerMock.replayAll(mockImpl); 

     Boolean resp = mockImpl.checkConnection(); 

     PowerMock.verifyAll(); 

     Validate.notNull(resp); 
    } 

} 
+0

等一下,您每次創建一個_new connection_嗎? – fge

+0

是的,一直認爲行Validator.validateConnection();被執行的時候,類就完成了連接。但我做這個例子並沒有失去對如何模擬像Validator.validateConnection();並且只返回tru或false而不在類中創建一個方法Class_Implementation – IvanCC

回答

0

只是嘲笑你Class_Implementation(你應該更改名稱,粘到Java命名的方式的標準)和存根validateConnection()方法:

final Class_Implementation mock = mock(Class_Implementation.class); 

when(mock.checkConnection()).thenReturn(true); // or false 

但無論如何,你應該嘲笑是接口開始。

+0

感謝fge的響應,這裏的問題是我無法模擬整個類的Class_Implementation,因爲在執行該行之後:Validator.validateConnection(); methos做另一件事... – IvanCC

+1

你應該重新考慮你的設計;例如,使你的Validator成爲一個接口並將它作爲參數傳遞給你的類實現或其他東西。但是,由於它似乎寫了,你的代碼很難測試。看起來你需要在這裏尋找PowerMockito,因爲mockito不能模擬靜態方法。但首先,考慮重新設計,從長遠來看,這將節省時間。 – fge

1

使用Validator對象而不是其靜態方法並將Validator注入Class_Implementation(通過構造函數)。這叫做Dependency Injection。在你的測試中,你可以注入Validator的模擬。

public class Validator { 
    public boolean validateConnection() { 
    ... 
    } 
} 

public class Class_Implementation { 
    private final Validator validator; 

    public Class_Implementation(Validator validator) { 
    this.validator = validator; 
    } 

    public boolean checkConnection() { 
    ... 
    validator.validateConnection(); 
    ... 
    } 
} 

public public class Class_ImplementationTest { 

    @Test 
    public void validate_Connection() throws Exception { 
    Validator validator = Mockito.mock(Validator.class); 
    Mockito.when(validator.validateConnection()).thenReturn(true); 

    Class_Implementation impl = new Class_Implementation(validator); 
    boolean response = mockImpl.checkConnection(); 

    Assert.assertTrue(response); 
    } 
} 

我對代碼做了一些額外的修改。

  1. 如果只有兩種狀態,則不返回布爾對象。
  2. 單元測試對類進行測試,並且被命名爲具有附加測試前綴的類。
  3. 如果你有很好的代碼,你不需要PowerMock。
相關問題