Программируемый драйвер JDBC для насмешек - PullRequest
2 голосов
/ 09 мая 2011

Я пытаюсь протестировать унаследованное Java-приложение, но в данный момент не могу повторно проанализировать его код.Все, что мне нужно сделать, это понять, какие SQL-запросы он отправляет через JDBC и когда.Все эти запросы я хотел бы протоколировать в виде простого текстового файла для дальнейшего рассмотрения.

Мне нужно разработать собственный драйвер JDBC, который будет обманывать приложение и вести себя как обычный драйвер (примет запрос1003 * возвращает некоторые значения , не удается при определенных условиях и т. Д.).Как обычно, фиктивная структура ...

Вопрос в том, знаете ли вы какие-либо существующие фреймворки для этой задачи?В идеале я хотел бы иметь возможность настраивать поведение моего драйвера, например, с помощью файла XML.

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

p6spy оборачивает существующее соединение jdbc и позволяет вам, например, посмотрим, что идет вперед и назад.

См. http://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-solution/ для инструкций.

0 голосов
/ 03 января 2014

Если вы хотите выполнить модульные тесты, а не интеграционные тесты, вы можете использовать очень простой и простой подход, используя только 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...