web-dev-qa-db-ja.com

JpaTestを実行するときに@SpringBootConfigurationが見つかりません

私はフレームワークに不慣れなので(クラスに合格したばかりです)、これがspringbootを使用するのは今回が初めてです。

私のCrudRepositoriesが本当に機能しているかどうかを確認するために単純なJunitテストを実行しようとしています。

私が得続けるエラーは:

@SpringBootConfigurationが見つからないため、テストには@ContextConfigurationまたは@SpringBootTest(classes = ...)を使用する必要があります。Java.lang.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ブートアプリケーションスターター

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

    }
}

前もって感謝します

130
Thomas Billet

確かに、Spring Bootはほとんどの場合それ自身をセットアップします。あなたはおそらくあなたが投稿したコードの多く、特にApplicationをすでに取り除くことができるでしょう。

すべてのクラスのパッケージ名、または少なくともApplicationJpaTestのパッケージ名を含めてください。 @DataJpaTestと他のいくつかのアノテーションについてのことは、彼らが現在のパッケージの中で@SpringBootConfigurationアノテーションを探すということです、そして、彼らがそれを見つけることができないなら、彼らはそれが見つかるまでパッケージ階層をたどります。

たとえば、テストクラスの完全修飾名がcom.example.test.JpaTestで、アプリケーションの名前がcom.example.Applicationの場合、テストクラスは@SpringBootApplication(およびその中では@SpringBootConfiguration)を見つけることができます。

ただし、com.example.application.Applicationのように、アプリケーションがパッケージ階層の別のブランチに存在していた場合は、notになります。

次の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() {
    }
}

すべてうまくいっているはずです。 appという名前でsrc/main/com/example内に新しいフォルダーを作成してから、その中にApplication.Javaを入れる(そしてファイル内のpackage宣言を更新する)と、次のエラーが発生します。

Java.lang.IllegalStateException:@SpringBootConfigurationを見つけることができません、あなたのテストで@ContextConfigurationまたは@SpringBootTest(classes = ...)を使用する必要があります

199
Thomas Kåsene

設定はアプリケーションクラスに結び付けられているので、以下はすべてを正しく設定します。

@SpringBootTest(classes = Application.class)

JHipsterプロジェクトの例 ここ

65
mrts

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

15
Mohammed Rafeeq

ThomasKåseneが言ったことに加えて、あなたはまた加えることができます

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

ファイルの階層構造をリファクタリングしたくない場合は、テスト注釈に対して、他のクラスを探す場所を指定します。これはエラーメッセージが言うことによって示唆するものです:

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

Spring Boot 1.4で提供された テストスライス feature 向けのテスト機能をもたらしました。

例えば、

@JsonTest は、jsonのシリアライゼーションとデシリアライゼーションをテストするための単純なJackson環境を提供します。

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

@WebMvcTest(PostController.class)
public class PostControllerMvcTest{

    @Inject MockMvc mockMvc;

}

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

@RestClientTest テスト用のRESTクライアント環境を提供します。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{
}

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

  1. @DataJpaTest@SpringBootTestを混在させないでください。上で述べたように、@DataJpaTestは独自の方法で設定を構築します(例えば、デフォルトでは、代わりに埋め込みH2を準備しようとします)。 @DataJpaTest テストスライス に指定されています。
  2. @DataJpaTestの設定をカスタマイズしたい場合は、このトピックについてのSpring.ioの この公式ブログエントリ を読んでください(少し退屈です)。
  3. ApplicationWebConfigなどの機能によって、DataJpaConfig内の設定をより小さな設定に分割します。 フル機能の設定 (混在するWeb、データ、セキュリティなど)は テストスライス ベースのテストも引き起こします失敗する。 テストサンプル in my sample を確認してください。
2
Hantsy

それは私のために働く

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

change to this

1
hang gao

私はこの問題に対する最善の解決策はあなたのテストのフォルダ構造をアプリケーションのフォルダ構造に合わせることであると思います。

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

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

0
silver

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

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

そして

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

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

0
Nick