{"id":18519306,"url":"https://github.com/darrmirr/dbchange","last_synced_at":"2026-01-28T09:36:27.268Z","repository":{"id":56743370,"uuid":"524505753","full_name":"DarrMirr/dbchange","owner":"DarrMirr","description":"Easy and declarative way to execute sql queries in JUnit tests.","archived":false,"fork":false,"pushed_at":"2023-07-04T21:17:58.000Z","size":171,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-07T21:43:39.628Z","etag":null,"topics":["database","java","junit","junit5","junit5-extension","sql"],"latest_commit_sha":null,"homepage":"https://github.com/DarrMirr/dbchange","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DarrMirr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-08-13T20:53:26.000Z","updated_at":"2023-09-17T07:40:08.000Z","dependencies_parsed_at":"2025-01-13T15:28:01.972Z","dependency_job_id":"95a6e317-c38e-47ee-87df-c62d979eeab8","html_url":"https://github.com/DarrMirr/dbchange","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/DarrMirr/dbchange","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DarrMirr%2Fdbchange","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DarrMirr%2Fdbchange/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DarrMirr%2Fdbchange/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DarrMirr%2Fdbchange/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DarrMirr","download_url":"https://codeload.github.com/DarrMirr/dbchange/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DarrMirr%2Fdbchange/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28843942,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T07:39:25.367Z","status":"ssl_error","status_checked_at":"2026-01-28T07:39:24.487Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","java","junit","junit5","junit5-extension","sql"],"created_at":"2024-11-06T17:16:01.279Z","updated_at":"2026-01-28T09:36:27.242Z","avatar_url":"https://github.com/DarrMirr.png","language":"Java","readme":"![](docs/img/DbChange.drawio.png)\n\n---\nEasy and declarative way to execute sql queries in JUnit tests.\n\n### Project goals\n\n1. Provide rich API to code sql queries that are executed in tests written on JUnit 5.\n2. Simplify sql queries maintaining in code base.\n3. Provide library independent of various frameworks (Uses only standard Java library and Junit 5 compile dependency)\n\n### Core concept\n\nThere are three annotations:\n1. DbChange\n2. DbChangeOnce\n3. SqlExecutorGetter\n\n#### DbChange\nProvide meta information about RDBMS changes before/after EACH test execution in class.\n\n#### DbChangeOnce\nProvide meta information about RDBMS changes before/after ALL tests execution in class.\n\n#### SqlExecutorGetter\nSet default sql executor for all tests in class. Value in this annotation should be the name of public method in test class that returns instance of `DefaultSqlExecutor`.\n\n*Annotations position in code:*\n\n```java\n\n@ExtendWith(DbChangeExtension.class)\n@DbChangeOnce\n@SqlExecutorGetter\npublic class DbChangeUsageTest {\n    \n    @Test\n    @DbChange\n    void test() {\n    }\n}\n```\n\n### How to plug library into project\n\n#### Gradle\n1. Open to edit `build.gradle.kts` (or `build.gradle` for groovy)\n2. Add `Dbchange` dependency to project\n```kotlin\ndependencies {\n    testImplementation(\"io.github.darrmirr:dbchange:1.0.1\")\n}\n```\n\n#### Maven\n1. Open to edit your project `pom.xml`\n2. Add `Dbchange` dependency to dependecies section\n```xml\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.darrmirr\u003c/groupId\u003e\n        \u003cartifactId\u003edbchange\u003c/artifactId\u003e\n        \u003cversion\u003e1.0.1\u003c/version\u003e\n        \u003cscope\u003etest\u003c/scope\u003e\n    \u003c/dependency\u003e\n```\n\n### How to use extension\n1. (mandatory) Put `@ExtendWith(DbChangeExtension.class)` on test class.\n2. (mandatory) Create public method in test class that returns instance of `DefaultSqlExecutor`.\n3. (optional) Put `@DbChangeOnce` on test class \n4. (optional) Put `@SqlExecutorGetter` on test class \n5. (optional) Put `@DbChange` on test method \n\n*Points to notice:* \n- If there are no annotations `@DbChangeOnce` or `@DbChange` in test class then Dbchange library does nothing during test execution.\n- If `@SqlExecutorGetter` is not present on test class then it is mandatory to set value `sqlExecutorGetter` in each `@DbChangeOnce` and `@DbChange` annotation.\n- If you use `@DbChangeOnce` in test then you have to initialize instance of DataSource class at test class constructor or in static context (for example, using JUnit annotation `@BeforeAll`)\n\n*Simple example:*\n\n```java\n@ExtendWith(DbChangeExtension.class)\n@DbChangeOnce(sqlQueryFiles = \"sql/database_init.sql\")\n@DbChangeOnce(sqlQueryFiles = \"sql/database_destroy.sql\", executionPhase = ExecutionPhase.AFTER_ALL)\n@SqlExecutorGetter(\"defaultSqlExecutor\")\npublic class DbChangeUsageTest {\n    private DataSource dataSource;\n    \n    public DbChangeUsageTest() {\n        dataSource = // code to create instance of dataSource \n    }\n\n    public SqlExecutor defaultSqlExecutor() {\n        return new DefaultSqlExecutor(dataSource);\n    }\n\n    @Test\n    @DbChange(changeSet = InsertEmployee6Chained.class )\n    @DbChange(changeSet = DeleteEmployee6Chained.class , executionPhase = DbChange.ExecutionPhase.AFTER_TEST)\n    void changeSetChained() {\n        /* code omitted */\n    }\n}\n```\n\n### Sql queries suppliers\n\nThere are following sql queries suppliers:\n- **statements**\n```java\n    @Test\n    @DbChange(statements = {\n            \"insert into department(id, name) values (14, 'dep14');\",\n            \"insert into occupation(id, name) values (8, 'occ8');\",\n            \"insert into employee(id, department_id, occupation_id, first_name, last_name) values (10, 14, 8, 'Ivan', 'Ivanov')\"\n    })\n    @DbChange(statements = {\n            \"delete from employee where id = 10;\",\n            \"delete from occupation where id = 8;\",\n            \"delete from department where id = 14;\"\n    }, executionPhase = DbChange.ExecutionPhase.AFTER_TEST)\n    void statements() { /* code omited */ }\n```\n- **sql query files**\n```java\n    @Test\n    @DbChange(sqlQueryFiles = {\"sql/sqlqueryfiles/sqlQueryFilesTest1_init.sql\", \"sql/sqlqueryfiles/sqlQueryFilesTest2_init.sql\"})\n    @DbChange(sqlQueryFiles = \"sql/sqlqueryfiles/sqlQueryFilesTest_destroy.sql\", executionPhase = DbChange.ExecutionPhase.AFTER_TEST)\n    void sqlQueryFiles() { /* code omited */ }\n```\n- **sql query getter**\n```java\n    @Test\n    @DbChange(sqlQueryGetter = \"testSqlQueryGetterInit\")\n    @DbChange(sqlQueryGetter = \"testSqlQueryGetterDestroy\", executionPhase = DbChange.ExecutionPhase.AFTER_TEST)\n    void sqlQueryGetter() { /* code omited */ }\n\n    public SqlQueryGetter testSqlQueryGetterInit() { /* code omited */ }\n\n    public SqlQueryGetter testSqlQueryGetterDestroy() { /* code omited */ }\n```\n- **changeset**\n```java\n    @Test\n    @DbChange(changeSet = InsertEmployee6Chained.class )\n    @DbChange(changeSet = DeleteEmployee6Chained.class , executionPhase = DbChange.ExecutionPhase.AFTER_TEST)\n    void changeSetChained() { /* code omited */ }\n```\n- **@MethodSource** (only for JUnit parameterized test)\n```java\n    @ParameterizedTest\n    @MethodSource(\"sourceSqlQueryGetterParameterized\")\n    void sqlQueryGetterParameterized(List\u003cDbChangeMeta\u003e dbChangeMetas, List\u003cDepartment\u003e expectedDepartments) { /* code omited */ }\n\n    public static Stream\u003cArguments\u003e sourceSqlQueryGetterParameterized() { /* code omited */ }\n```\n\n*Notice:*\n- all sql queries suppliers (except `@MethodSource`) are supported by `@DbChange` and `@DbChangeOnce` annotations.\n\n\nSee usage example in `com.github.darrmirr.dbchange.component.DbChangeUsageTest` class.\n\nRead article on [medium.com](https://darrmirr.medium.com/introduction-to-dbchange-junit-extension-7995a5a639e7) for more details\n\n### Minimum requirements:\n\n*Runtime:*\n- JRE 8\n- JUnit 5.9+ in classpath\n\n*Development:*\n- JDK 8\n- Gradle 7\n\n### Articles:\n\n- [On medium.com](https://darrmirr.medium.com/introduction-to-dbchange-junit-extension-7995a5a639e7)\n- [On habr.com](https://habr.com/ru/post/684692/)","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarrmirr%2Fdbchange","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdarrmirr%2Fdbchange","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarrmirr%2Fdbchange/lists"}