2012-02-17 2 views
11

Есть ли какой-то драйвер JDBC, который просто игнорирует вызовы базы данных?Драйвер базы данных исправлений

Для разработки я переношу приложение на виртуальную машину. Здесь я хочу работать только с частью GUI. Но приложение делает несколько запросов к базе данных, которая не позволяет приложению даже запускаться. Я не хочу менять код приложения в это время, так как база данных в значительной степени связана.

Итак, я думал, что может быть драйвер JDBC, который просто возвращает пустые результаты для запросов.

+0

Несколько иной подход, который я видел, заключался в том, чтобы заглушить базу данных с помощью hsqldb в памяти, инициализированной из текстовых файлов. – flup

ответ

10

Я решил написать собственный простой примерный драйвер. Это было очень прямолинейно и делало то, что я хочу. Я могу переключить драйвер базы данных приложения с помощью файла конфигурации, чтобы я мог позволить приложению использовать мой драйвер простым способом.

Затем я расширил драйвер, чтобы вернуть данные, которые он анализирует из файлов CSV. Я опубликовал код на Google Code, может быть, кто-то может получить использовать его: dummyjdbc

+0

+1. Я должен был прочитать этот пост и найти ваш инструмент, прежде чем я включил свой собственный драйвер JDBC mock в [jOOQ] (http://www.jooq.org), недавно –

1

Никогда не слышал о таком драйве самостоятельно. Если вы его не найдете, вместо этого вы можете использовать DB, как HSQLDB. Вы можете настроить его на использование таблиц в памяти, поэтому ничего не записывается на диск. Однако вам придется использовать другую строку соединения.

8

Есть некоторые «недействительные» драйверы JDBC как часть Mocking framewroks, например MockDriver от Mockrunner.

Но для этого требуется некоторая кодировка.

Это связано с тем, что когда приложение Java подключается к базе данных, он предоставляет URL-адрес JDBC в форме jdbc:mysql://localhost. Система ищет, какой драйвер зарегистрирован в нем для обработки такого типа URL-адреса и выбирает правильный драйвер. Информация о том, какой драйвер типа URL-адреса поддерживается, содержится в самом драйвере, и невозможно, чтобы макет-драйвер держал в нем все известные типы URL-адресов: там нет никаких подстановочных знаков, и список не будет заполнен.

Итак, если вы можете позвонить по телефону JDBCMockObjectFactory.registerMockDriver() в приложение, прежде чем он подключится к базе данных, он выполнит эту работу. Если нет - я не думаю, что это возможно. Однако небольшая модификация кода драйвера будет делать это ... но опять же - требуется кодирование.

3

jOOQ судов с MockConnection, которые могут быть предоставлены с MockDataProvider, что гораздо легче реализовать, чем полный JDBC API. Этот блог показывает, как использовать MockConnection: http://blog.jooq.org/2013/02/20/easy-mocking-of-your-database/

Пример:

MockDataProvider provider = new MockDataProvider() { 

    // Your contract is to return execution results, given a context 
    // object, which contains SQL statement(s), bind values, and some 
    // other context values 
    @Override 
    public MockResult[] execute(MockExecuteContext context) 
    throws SQLException { 

     // Use ordinary jOOQ API to create an org.jooq.Result object. 
     // You can also use ordinary jOOQ API to load CSV files or 
     // other formats, here! 
     DSLContext create = DSL.using(...); 
     Result<MyTableRecord> result = create.newResult(MY_TABLE); 
     result.add(create.newRecord(MY_TABLE)); 

     // Now, return 1-many results, depending on whether this is 
     // a batch/multi-result context 
     return new MockResult[] { 
      new MockResult(1, result) 
     }; 
    } 
}; 

// Put your provider into a MockConnection and use that connection 
// in your application. In this case, with a jOOQ DSLContext: 
Connection connection = new MockConnection(provider); 
DSLContext create = DSL.using(connection, dialect); 

// Done! just use regular jOOQ API. It will return the values 
// that you've specified in your MockDataProvider 
assertEquals(1, create.selectOne().fetch().size()); 

Существует также MockFileDatabase, который поможет вам соответствующие фиктивные результаты с строк SQL, написав текстовый файл, как это:

# This is a sample test database for MockFileDatabase 
# Its syntax is inspired from H2's test script files 

# When this query is executed... 
select 'A' from dual; 
# ... then, return the following result 
> A 
> - 
> A 
@ rows: 1 

# Just list all possible query/result combinations 
select 'A', 'B' from dual; 
> A B 
> - - 
> A B 
@ rows: 1 

select "TABLE1"."ID1", "TABLE1"."NAME1" from "TABLE1"; 
> ID1 NAME1 
> --- ----- 
> 1 X 
> 2 Y 
@ rows: 2 
0

Если вы используете Spring, создайте свой собственный класс, который реализует Datasource и методы не будут делать ничего.

1

Acolyte - это хорошо протестированный драйвер JDBC, предназначенный для таких целей (макет, тестирование, ...): https://github.com/cchantep/acolyte

Он уже используется в нескольких проектах с открытым исходным кодом, либо в ванильным Java, или используя его Scala DSL:

// Register prepared handler with expected ID 'my-unique-id' 
acolyte.Driver.register("my-unique-id", handler); 
// then ... 
Connection con = DriverManager.getConnection(jdbcUrl); 
// ... Connection |con| is managed through |handler| 
1

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

    } 
} 

чем вы можете проверить различные сценарии, как и в любом другом 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)); 
} 
Смежные вопросы