2011-05-08 66 views
2

我正在嘗試測試遺留Java應用程序,但此時無法重新設置其代碼。我需要做的就是了解它通過JDBC發送什麼SQL請求以及何時發送。我希望將所有這些請求協議爲純文本文件以供將來查看。用於模擬的可編程JDBC驅動程序

我需要開發一個自定義的JDBC驅動程序,這將欺騙應用程序,並像一個正常的驅動程序(將接受請求,返回在一定條件下一些值,失敗等)。一個模擬結構,像往常一樣...

問題是 - 你知道任何現有的框架這項任務?理想情況下,我希望能夠通過XML文件來配置驅動程序的行爲。

回答

0

如果你想要做單元測試,而不是一個集成測試,比 你可以使用一個很基本的,簡單的方法,只有使用的Mockito,像這樣:

public class JDBCLowLevelTest { 

    private TestedClass tested; 
    private Connection connection; 
    private static Driver driver; 

    @BeforeClass 
    public static void setUpClass() throws Exception { 
     // (Optional) Print DriverManager logs to system out 
     DriverManager.setLogWriter(new PrintWriter((System.out))); 

     // (Optional) Sometimes you need to get rid of a driver (e.g JDBC-ODBC Bridge) 
     Driver configuredDriver = DriverManager.getDriver("jdbc:odbc:url"); 

     System.out.println("De-registering the configured driver: " + configuredDriver); 
     DriverManager.deregisterDriver(configuredDriver); 

     // Register the mocked driver 
     driver = mock(Driver.class); 
     System.out.println("Registering the mock driver: " + driver); 
     DriverManager.registerDriver(driver); 
    } 

    @AfterClass 
    public static void tearDown() throws Exception { 
     // Let's cleanup the global state 
     System.out.println("De-registering the mock driver: " + driver); 
     DriverManager.deregisterDriver(driver); 
    } 

    @Before 
    public void setUp() throws Exception { 
     // given 
     tested = new TestedClass(); 

     connection = mock(Connection.class); 

     given(driver.acceptsURL(anyString())).willReturn(true); 
     given(driver.connect(anyString(), Matchers.<Properties>any())) 
       .willReturn(connection); 

     given(connection.prepareCall(anyString())).willReturn(statement);   
} 
} 

比你可以測試各種不同場景,就像其他任何Mockito測試一樣

@Test 
public void shouldHandleDoubleException() throws Exception { 
    // given 
    SomeData someData = new SomeData(); 

    given(connection.prepareCall(anyString())) 
      .willThrow(new SQLException("Prepare call")); 
    willThrow(new SQLException("Close exception")).given(connection).close(); 

    // when 
    SomeResponse response = testClass.someMethod(someData); 

    // then 
    assertThat(response, is(SOME_ERROR)); 
}