Spring игнорирует bean-компоненты в тестах интеграции подмодулей - PullRequest
2 голосов
/ 03 июня 2019

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

Тем не менее, я создал абстрактную конфигурацию следующим образом:

package br.com.rk.services;

import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.context.junit.jupiter.SpringExtension;

/**
 * @author Rhuan Karlus
 * @since 6/3/19
 */
@ExtendWith(SpringExtension.class)
@Sql({"/drop_data.sql", "/data.sql"})
@SpringBootTest(
        webEnvironment = SpringBootTest.WebEnvironment.MOCK,
        properties = {
                "spring.datasource.name=HikariCP-Pool",
                "spring.datasource.type=com.zaxxer.hikari.HikariDataSource",
                "spring.datasource.driver-class-name=org.hsqldb.jdbcDriver",
                "spring.datasource.url=jdbc:hsqldb:mem:.",
                "spring.datasource.username=sa",
                "spring.datasource.password=",
                "spring.flyway.enabled=true",
                "spring.flyway.locations=classpath:/db/migrations/hsql",
                "spring.data.jpa.repositories.enabled=true",
                "spring.jpa.show-sql=true",
                "debug=true"
        })
public abstract class AbstractServiceIntegrationTest {

    @SpringBootApplication(scanBasePackages = "br.com.rk")
    static class TestApplication {
    }

}

Обратите внимание, что все мои свойства описаны в параметре properties аннотации @SpringBootTest.Это было сделано в качестве обходного пути, чтобы избежать создания другого application-test.properties, поскольку он уже был создан в модуле api (другой модуль в проекте, он находится над уровнем сервиса, поэтому для уровня сервиса его даже не существует).

А вот простой тест:

package br.com.rk.services;

import org.junit.jupiter.api.Test;

/**
 * @author Rhuan Karlus
 * @since 6/3/19
 */
public class TestandoIntegracao extends AbstractServiceIntegrationTest {

    @Test
    public void simpleTest() {
        System.out.println("foo");
    }

}

Проблема возникает, когда я пытаюсь запустить метод simpleTest.Он корректно загружает конфигурацию контекста, за исключением bean-компонентов, а затем выдает следующее сообщение:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'br.com.rk.repositories.audit.AuditRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1509)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:818)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:724)
    ... 84 more

Как вы можете видеть, в журнале отмечается AuditRepository, в котором говорится, что не существует подходящего bean-компонента для автоматической передачи по одному измои службы, но дело в том, что bean-компонент определен и помечен @Repository, и это правильно работает для модуля api (уже упоминалось).Поэтому я не понимаю, что здесь происходит, и я не могу понять, как настроить эти тесты для правильной загрузки контекста Spring для доступа ко всем bean-компонентам.

Просто, чтобы записать это, вот мой AuditRepository:

package br.com.rk.repositories.audit;

import br.com.rk.entities.audit.Audit;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

/**
 * @author Rhuan Karlus
 * @since 3/22/19
 */
@Repository
public interface AuditRepository extends JpaRepository<Audit, Long> {

}

----------------------------- РЕДАКТИРОВАТЬ -----------------------------

Если вы, ребята, хотите проверить весь проект, ознакомьтесь с https://github.com/rhuankarlus/spring-boot-rest-api/tree/feature/%2315

Я пытаюсь проверить модуль project-services.

Ответы [ 2 ]

1 голос
/ 03 июня 2019

У меня нет опыта в настройке приложения SpringBoot с нуля. Однако я никогда не использовал package-private в тестовом классе в качестве класса приложения SpringBoot. Я всегда использовал public. Попробуйте:

@SpringBootApplication(scanBasePackages = "br.com.rk")
public class MyAwesomeApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyAwesomeApplication .class, args);
    }
}

Это должно быть в каталоге src/main/java.

0 голосов
/ 03 июня 2019

вместо

@SpringBootApplication(scanBasePackages = "br.com.rk.*")

попробовать

@SpringBootApplication(scanBasePackages = "br.com.rk")
...