Не удалось найти @ SpringBootConfiguration при выполнении JpaTest
Я новичок в фреймворках (только что прошел класс), и это мой первый раз с помощью springboot.
Я пытаюсь запустить простой тест Junit, чтобы увидеть, если мои CrudRepositories действительно работают.
ошибка, которую я продолжаю получать:
не удается найти @SpringBootConfiguration, необходимо использовать @ContextConfiguration или @SpringBootTest (classes=...) с вашим тестом Ява.ленг.IllegalStateException
не пружинная загрузка настроить себя?
Мой Тестовый Класс
@RunWith(SpringRunner.class)
@DataJpaTest
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class JpaTest {
@Autowired
private AccountRepository repository;
@After
public void clearDb(){
repository.deleteAll();
}
@Test
public void createAccount(){
long id = 12;
Account u = new Account(id,"Tim Viz");
repository.save(u);
assertEquals(repository.findOne(id),u);
}
@Test
public void findAccountByUsername(){
long id = 12;
String username = "Tim Viz";
Account u = new Account(id,username);
repository.save(u);
assertEquals(repository.findByUsername(username),u);
}
мой стартер приложения Spring boot
@SpringBootApplication
@EnableJpaRepositories(basePackages = {"domain.repositories"})
@ComponentScan(basePackages = {"controllers","domain"})
@EnableWebMvc
@PropertySources(value {@PropertySource("classpath:application.properties")})
@EntityScan(basePackages={"domain"})
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
}
}
Мой Репозиторий
public interface AccountRepository extends CrudRepository<Account,Long> {
public Account findByUsername(String username);
}
}
спасибо заранее
5 ответов:
действительно, Spring Boot по большей части настраивается. Вероятно, вы уже можете избавиться от большого количества кода, который вы опубликовали, особенно в
Application.Я хотел бы, чтобы вы включили имена пакетов всех ваших классов или, по крайней мере, для
ApplicationиJpaTest. Дело в том, что@DataJpaTestи несколько других аннотаций заключается в том, что они ищут@SpringBootConfigurationаннотация в текущем пакете, и если они не могут найти его там, они пересекают иерархию пакетов, пока не найдут оно.например, если полное имя тестового класса
com.example.test.JpaTestи один для вашего приложенияcom.example.Application, тогда ваш тестовый класс сможет найти@SpringBootApplication(и@SpringBootConfiguration).если приложение находится в другой ветви иерархии пакетов, однако, как
com.example.application.Application, это было не найти его.пример
рассмотрим следующие Maven проект:
my-test-project +--pom.xml +--src +--main +--com +--example +--Application.java +--test +--com +--example +--test +--JpaTest.javaи затем следующее содержание в
Application.java:package com.example; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }с последующим содержанием
JpaTest.java:package com.example.test; @RunWith(SpringRunner.class) @DataJpaTest public class JpaTest { @Test public void testDummy() { } }все должно работать. Если вы создадите новую папку внутри
src/main/com/exampleпод названиемapp, а потомApplication.javaвнутри него (и обновитьpackageобъявление внутри файла), запуск теста даст вам следующую ошибку:java.ленг.IllegalStateException: не удается найти @SpringBootConfiguration, вам нужно использовать @ContextConfiguration или @SpringBootTest (classes=...) с вашим тестом
конфигурация прикреплена к классу приложения, поэтому все будет настроено правильно:
@SpringBootTest(classes = Application.class)пример из проекта JHipster здесь.
стоит проверить, если вы рефакторинг имя пакета вашего главного класса с аннотацией
@SpringBootApplication. В этом случае testcase должен быть в соответствующем пакете, иначе он будет искать его в более старом пакете . это был случай для меня.
в дополнение к тому, что сказал Томас Косене, вы также можете добавить
@SpringBootTest(classes=com.package.path.class)в аннотации теста указать, где он должен искать другой класс, если вы не хотите рефакторинг иерархии файлов. Вот на что намекает сообщение об ошибке, говоря:
Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) ...
The тестовый фрагмент при условии, что весной загрузки 1.4 принес характеристика ориентированные возможности теста.
например,
@JsonTest предоставляет простую среду Джексона для тестирования сериализации и десериализации json.
@WebMvcTest обеспечивает макет веб-среды, он может указать класс контроллера для тестирования и ввести MockMvc в тест.
@WebMvcTest(PostController.class) public class PostControllerMvcTest{ @Inject MockMvc mockMvc; }@DataJpaTest подготовит встроенную базу данных и предоставляет базовую среду JPA для теста.
@RestClientTest обеспечивает среду клиента REST для теста, esp RestTemplateBuilder и т. д.
эти аннотации не составлены с SpringBootTest, они объединены с серией
AutoconfigureXXXи@TypeExcludesFilterПримечание.посмотреть
@DataJpaTest.@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @BootstrapWith(SpringBootTestContextBootstrapper.class) @OverrideAutoConfiguration(enabled = false) @TypeExcludeFilters(DataJpaTypeExcludeFilter.class) @Transactional @AutoConfigureCache @AutoConfigureDataJpa @AutoConfigureTestDatabase @AutoConfigureTestEntityManager @ImportAutoConfiguration public @interface DataJpaTest {}вы можете добавить аннотацию @AutoconfigureXXX, чтобы переопределить конфигурацию по умолчанию.
@AutoConfigureTestDatabase(replace=NONE) @DataJpaTest public class TestClass{ }давайте посмотрим на вашу проблему,
- не смешивайте
@DataJpaTestи@SpringBootTest, как сказано выше@DataJpaTestбудут строить конфигурацию по-своему(например. по умолчанию он попытается подготовить встроенный H2 вместо этого) из наследования конфигурации приложения.@DataJpaTestпредназначен для