Jestem nowy w frameworkach (właśnie zdałem klasę) i po raz pierwszy korzystam z Spring Boot.
Próbuję uruchomić prosty test Junita, aby sprawdzić, czy moje CrudRepositories rzeczywiście działają.
Błąd, który ciągle się pojawia to:
Nie można znaleźć @SpringBootConfiguration, musisz użyć @ContextConfiguration lub @SpringBootTest (klas = ...) z testem java.lang.IllegalStateException
Czy Spring Boot się nie konfiguruje?
Moja klasa testowa:
@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);
}
Starter aplikacji My 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);
}
}
Moje repozytorium:
public interface AccountRepository extends CrudRepository<Account,Long> {
public Account findByUsername(String username);
}
}
źródło
Application
jest w środku. Jeśli jednak masz na myślisrc/main
isrc/test
, to te foldery nie są częścią pakietu hierarchia. Być może lepiej jest po prostu zaktualizować swoje pytanie za pomocą zrzutu ekranu lub wyjaśnienia, jaka jest struktura projektu.Konfiguracja jest dołączona do klasy aplikacji, więc następujące ustawienia skonfigurują wszystko poprawnie:
Przykład z projektu JHipster tutaj .
źródło
Warto sprawdzić, czy dokonano refaktoryzacji nazwy pakietu głównej klasy z adnotacjami
@SpringBootApplication
. W takim przypadku zestaw testowy powinien znajdować się w odpowiednim pakiecie, w przeciwnym razie będzie go szukał w starszym pakiecie. tak było w moim przypadku.źródło
Oprócz tego, co powiedział Thomas Kåsene, możesz również dodać
do adnotacji testowej, aby określić, gdzie powinna szukać drugiej klasy, jeśli nie chcesz refaktoryzować hierarchii plików. Oto, na co wskazuje komunikat o błędzie, mówiąc:
źródło
W moim przypadku pakiety różniły się między klasami Application i Test
i
Po ich uzgodnieniu testy przebiegły poprawnie.
źródło
To działa dla mnie
nazwa pakietu powyższej klasy testowej jest zmieniana na taką samą jak nazwa pakietu normalnej klasy.
zmień na to
źródło
Plaster badanie przewidziane w Boot 1,4 Wiosna przyniosła m.in. zorientowanych możliwości testowych.
Na przykład,
@JsonTest zapewnia proste środowisko Jacksona do testowania serializacji i deserializacji json.
@WebMvcTest zapewnia fałszywe środowisko sieciowe, może określić klasę kontrolera do testu i wstrzyknąć MockMvc do testu.
@DataJpaTest przygotuje osadzoną bazę danych i zapewni podstawowe środowisko JPA na potrzeby testu.
@RestClientTest zapewnia środowisko testowe klienta REST, szczególnie RestTemplateBuilder itp.
Te adnotacje nie składają się z SpringBootTest, są połączone w szereg
AutoconfigureXXX
, a A@TypeExcludesFilter
adnotacje.Spójrz na
@DataJpaTest
.Możesz dodać adnotację @AutoconfigureXXX, aby zastąpić domyślną konfigurację.
Spójrzmy na twój problem,
@DataJpaTest
i@SpringBootTest
, jak wspomniano powyżej@DataJpaTest
, zbuduje konfigurację na swój własny sposób (np. Domyślnie zamiast tego spróbuje przygotować osadzoną H2) z dziedziczenia konfiguracji aplikacji.@DataJpaTest
jest przeznaczony do wycinka testowego .@DataJpaTest
, przeczytaj ten oficjalny wpis blogu z Spring.io na ten temat (trochę nudny).Application
do mniejszych konfiguracjach według funkcji, takich jakWebConfig
,DataJpaConfig
itp pełna konfiguracja funkcjonalnym (mieszane internetowej, danych, bezpieczeństwo itp) spowodował również swoje slice testy testy oparte być nie powiodło się. Sprawdź próbki testowe w mojej próbce .źródło
Myślę, że najlepszym rozwiązaniem tego problemu jest wyrównanie struktury folderów testów ze strukturą folderów aplikacji.
Miałem ten sam problem, który został spowodowany przez powielenie mojego projektu z innego projektu struktury folderów.
jeśli twój projekt testowy i projekt aplikacji będą miały tę samą strukturę, nie będziesz musiał dodawać żadnych specjalnych adnotacji do swoich klas testowych i wszystko będzie działać tak, jak jest.
źródło
Gdy wszystkie klasy były w tym samym pakiecie, działały klasy testowe. Gdy tylko przeniosłem wszystkie klasy Java do innego pakietu w celu utrzymania właściwej struktury projektu, otrzymałem ten sam błąd.
Rozwiązałem go, podając moją główną nazwę klasy w klasie testowej, jak poniżej.
źródło
Miałem ten sam problem i rozwiązałem go, dodając pustą klasę z adnotacją
SpringBootApplication
w pakiecie głównym folderu src / test / javaźródło
W moim przypadku
upewnij się, że twoje (
test package
imię )YourApplicationTests
jest równoważne (main package
imię ).źródło
Powyższe adnotacje działały dla mnie dobrze. Używam wiosennego rozruchu z JPA.
źródło