JpaTestの実行時に@SpringBootConfigurationが見つかりません


185

私はフレームワークの初心者(クラスを渡されたばかり)で、Spring Bootを初めて使用します。

簡単なJunitテストを実行して、CrudRepositoriesが実際に機能しているかどうかを確認しようとしています。

私が取得し続けるエラーは次のとおりです。

@SpringBootConfigurationが見つかりません。テストjava.lang.IllegalStateExceptionで@ContextConfigurationまたは@SpringBootTest(classes = ...)を使用する必要があります

Spring Bootはそれ自体を構成しませんか?

私のテストクラス:

@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);

    }
}

回答:


264

実際、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.lang.IllegalStateException:@SpringBootConfigurationが見つかりません。テストで@ContextConfigurationまたは@SpringBootTest(classes = ...)を使用する必要があります


1
テストとアプリケーションコード用に別のパッケージを使用して、Mavenパケットセットアップを使用したソリューションを提供していただき、ありがとうございます。私があなたが言っていることを正しく解釈している場合、それは私のテストパッケージをアプリケーションクラスに向けなければならないということですか?そして、それはSpringConfigurationを見つけますか?
Thomas Billet

「maven packet」が「モジュール」を意味する場合、はい、テストクラスが含まれるモジュールApplicationは、含まれているモジュールに依存する必要があります。ただし、src/mainおよびを意味する場合、src/testこれらのフォルダーはパッケージの一部ではありません。階層。おそらく、スクリーンショットやプロジェクトの構造の説明で質問を更新する方がよいでしょう。
ThomasKåsene16年

あなたが言ったように私は問題を解決しました。いくつかググリングした後、提案された春のパケット構造を見つけ、それらすべてをリファクタリングしました。これで、テストは期待どおりに実行されます。おかげで多く
トーマスビレット

わかりました。とにかく、より徹底した例で答えを更新しました。
ThomasKåsene16年

3
+-test +-com +-example +-JpaTest.javaも機能します
user674158 2017年

106

構成はアプリケーションクラスにアタッチされているため、以下はすべてを正しくセットアップします。

@SpringBootTest(classes = Application.class)

JHipsterプロジェクトの例はこちら


これは完璧な解決策のようです。クラスやフォルダを移動する必要はありません。
Abhishek Aggarwal

21

で注釈が付けられたメインクラスのパッケージ名がリファクタリングされているかどうかを確認することは価値があります@SpringBootApplication。その場合、テストケースは適切なパッケージにあるはずです。そうでなければ、古いパッケージでテストケースを探します。私にとってはそうでした。


11

ThomasKåseneの発言に加えて、

@SpringBootTest(classes=com.package.path.class)

ファイル階層をリファクタリングしたくない場合は、テストアノテーションに追加して、他のクラスを探す場所を指定します。これは、エラーメッセージが次のように言って示唆するものです。

Unable to find a @SpringBootConfiguration, you need to use 
@ContextConfiguration or @SpringBootTest(classes=...) ...

これはとても貴重な答えです!@cameronありがとうございます!
ランスの種類

6

私の場合、パッケージはApplicationクラスとTestクラスで異なりました

package com.example.abc;
...
@SpringBootApplication
public class ProducerApplication {

そして

package com.example.abc_etc;
...
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProducerApplicationTest {

それらを一致させた後、テストは正しく実行されました。


5

それは私のために働く

上記のテストクラスのパッケージ名は、通常のクラスのパッケージ名と同じに変更されます。

これに変更


3

テストスライス春ブーツ1.4持ち込まで提供機能指向のテスト機能。

例えば、

@JsonTestは、jsonのシリアル化と逆シリアル化をテストするための簡単なJackson環境を提供します。

@WebMvcTestはモックWeb環境を提供します。テスト用のコントローラークラスを指定し、テストにMockMvcを挿入できます。

@WebMvcTest(PostController.class)
public class PostControllerMvcTest{

    @Inject MockMvc mockMvc;

}

@DataJpaTestは組み込みデータベースを準備し、テストのための基本的なJPA環境を提供します。

@RestClientTestは、テスト、特にRestTemplateBuilderなどのRESTクライアント環境を提供します。

これらの注釈は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{
}

あなたの問題を見てみましょう、

  1. 混在させないでください@DataJpaTest@SpringBootTest、上記のように言った、@DataJpaTest独自の方法で設定を構築します(例えば、デフォルトでは、それは代わりに埋め込まれたH2を準備しようとします)アプリケーション構成の継承から。テストスライスに@DataJpaTest指定されています
  2. の設定をカスタマイズしたい場合は@DataJpaTest、Spring.ioからのこのトピックに関するこの公式ブログエントリをお読みください(少し退屈です)。
  3. で構成を分割Applicationなどの機能により、小規模な構成の中にWebConfigDataJpaConfigなどA フル機能の設定も、あなたの原因(混合ウェブ、データ、セキュリティなど)の試験スライスベースのテストが失敗します。私のサンプルのテストサンプルを 確認してください。

1

この問題の最良の解決策は、テストのフォルダー構造をアプリケーションのフォルダー構造に合わせることです。

別のフォルダー構造プロジェクトからプロジェクトを複製することによって引き起こされる同じ問題がありました。

テストプロジェクトとアプリケーションプロジェクトが同じ構造を持つ場合、テストクラスに特別な注釈を追加する必要はなく、すべてがそのまま機能します。


同じエラーが発生し、テストクラスのパッケージ名に「rules」の代わりにタイプミス「rule」があることがわかりました。パッケージ名を修正した後、エラーはなくなりました。
Gopal Bairwa

1

すべてのクラスが同じパッケージにある場合、テストクラスは機能していました。適切なプロジェクト構造を維持するためにすべてのJavaクラスを別のパッケージに移動するとすぐに、同じエラーが発生しました。

以下のようにテストクラスでメインクラス名を提供することで解決しました。

@SpringBootTest(classes=JunitBasicsApplication.class)

1

同じ問題がありSpringBootApplicationsrc / test / javaフォルダーのルートパッケージに注釈が付けられた空のクラスを追加することで解決しました

package org.enricogiurin.core;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CoreTestConfiguration {}

0

私の場合は
ことを確認してくださいあなたの(test package名前の)はYourApplicationTests(と同等ですmain package)。


-2
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureWebMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;



@RunWith(SpringRunner.class)
@DataJpaTest
@SpringBootTest
@AutoConfigureWebMvc
public class RepoTest {

    @Autowired
    private ThingShiftDetailsRepository thingShiftDetailsRepo;

    @Test
    public void findThingShiftDetails() {
            ShiftDetails details = new ShiftDetails();
            details.setThingId(1);

            thingShiftDetailsRepo.save(details);

            ShiftDetails dbDetails = thingShiftDetailsRepo.findByThingId(1);
            System.out.println(dbDetails);
    }
}

上記の注釈は私にはうまくいきました。JPAでスプリングブートを使用しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.