Я написал интеграционный тест, в котором используется встроенная база данных Mysql. Когда я выполняю тестовый класс в моей IDE, тесты успешно выполняются вместе с другими интеграционными тестами, которые появляются в том же классе. Проблема возникает, когда я запускаю все тесты вместе, используя Gradle через командную строку.
Ошибка, которую я получаю при запуске через командную строку, выглядит примерно так:
EmployeeRepositoryFindByEmployeeIdTest > shouldReturnDeparmentForEmployeeId() FAILED
java.lang.AssertionError:
Expecting:
<[Employee(ud=118 age=23,department=null),
Employee(id=219, age=24, department=Deparment(id=5, name=IT))]>
to contain exactly (and in same order):
<[Employee(ud=118 age=23,department=Deparment(id=4, name=IT)),
Employee(id=219, age=24, department=Deparment(id=5, name=IT))]>
but some elements were not found:
<[Employee(ud=118 age=23,department=Deparment(id=4, name=IT))]>
and others were not expected:
<[Employee(ud=118 age=23,department=null)]>
EmployeeRepositoryFindByEmployeeIdTest.shouldReturnDeparmentForEmployeeId(EmployeeRepositoryFindByEmployeeIdTest.java:188)
Тест вызывает следующий метод:
@Repository
public class EmployeeRepository {
private final DSLContext dsl;
public EmployeeRepository(DSLContext dsl, Clock clock) {
this.dsl = dsl;
}
// ...
public List<Employee> getEmployeeByDepartmentId(int departmentId) {
return dsl.select(
EMPLOYEE.ID,
EMPLOYEE.AGE,
EMPLOYEE.DEPARMENT_ID,
DEPARTMENT.ID,
DEPARTMENT.NAME
).from(EMPLOYEE)
.leftJoin(DEPARMENT).on(DEPARMENT.ID.eq(EMPLOYEE.DEPARMENT_ID))
.where(DEPARMENT.ID.eq(departmentId))
.orderBy(EMPLOYEE.ID)
.fetch()
.map(this::getEmployee);
}
}
После вызова метода теста ожидается получение двух сотрудников и связанного с ним отдела, но я всегда получаю null
для department_id=4
. Мне кажется, что соединение не выполняется правильно для некоторых строк в таблице.
Я попытался это исправить, чтобы увеличить wait_timeout
и max_connections
в конфигурации MySQL до чего-то очень высокого, но я все еще вижу ту же проблему. Кроме того, я обновил до последней версии БД - Version.v5_7_latest
- но все тот же. Я не уверен, где еще посмотреть, чтобы это исправить. Есть идеи, как двигаться дальше?
Если это поможет, вот конфигурация MySQL в настройках теста:
@Bean
public EmbeddedMysql embeddedMySql() {
if (embeddedMysql != null) {
embeddedMysql.reloadSchema("deparment", Collections.emptyList());
return embeddedMysql;
} else {
MysqldConfig config = aMysqldConfig(Version.v5_6_36)
.withCharset(Charset.UTF8)
.withPort(3322)
.withUser("department", "*******")
.withServerVariable("wait_timeout", "60")
.withServerVariable("max_connections", "500")
.build();
embeddedMysql = anEmbeddedMysql(config)
.addSchema("department")
.start();
return embeddedMysql;
}
}
Заранее спасибо за помощь!