私はフレームワークに不慣れなので(クラスに合格したばかりです)、これが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);
}
}
前もって感謝します
確かに、Spring Bootはほとんどの場合それ自身をセットアップします。あなたはおそらくあなたが投稿したコードの多く、特にApplication
をすでに取り除くことができるでしょう。
すべてのクラスのパッケージ名、または少なくともApplication
とJpaTest
のパッケージ名を含めてください。 @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 = ...)を使用する必要があります
設定はアプリケーションクラスに結び付けられているので、以下はすべてを正しく設定します。
@SpringBootTest(classes = Application.class)
JHipsterプロジェクトの例 ここ 。
あなたのメインクラスのパッケージ名が@SpringBootApplication
で注釈されていることをリファクタリングしたかどうかをチェックする価値があります。その場合、テストケースは適切なパッケージに入っているはずです。そうでなければ、古いパッケージでそれを探します。これは私の場合です。
ThomasKåseneが言ったことに加えて、あなたはまた加えることができます
@SpringBootTest(classes=com.package.path.class)
ファイルの階層構造をリファクタリングしたくない場合は、テスト注釈に対して、他のクラスを探す場所を指定します。これはエラーメッセージが言うことによって示唆するものです:
Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) ...
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{
}
あなたの問題を見てみましょう。
@DataJpaTest
と@SpringBootTest
を混在させないでください。上で述べたように、@DataJpaTest
は独自の方法で設定を構築します(例えば、デフォルトでは、代わりに埋め込みH2を準備しようとします)。 @DataJpaTest
は テストスライス に指定されています。@DataJpaTest
の設定をカスタマイズしたい場合は、このトピックについてのSpring.ioの この公式ブログエントリ を読んでください(少し退屈です)。Application
、WebConfig
などの機能によって、DataJpaConfig
内の設定をより小さな設定に分割します。 フル機能の設定 (混在するWeb、データ、セキュリティなど)は テストスライス ベースのテストも引き起こします失敗する。 テストサンプル in my sample を確認してください。それは私のために働く
上記のテストクラスのパッケージ名は、通常のクラスのパッケージ名と同じに変更されます。
change to this
私はこの問題に対する最善の解決策はあなたのテストのフォルダ構造をアプリケーションのフォルダ構造に合わせることであると思います。
私は私のプロジェクトを別のフォルダ構造のプロジェクトから複製することによって引き起こされた同じ問題を抱えていました。
テストプロジェクトとアプリケーションプロジェクトの構造が同じであれば、テストクラスに特別な注釈を追加する必要はなく、すべてがそのまま機能します。
私の場合、パッケージはApplicationクラスとTestクラスの間で異なりました
package com.example.abc;
...
@SpringBootApplication
public class ProducerApplication {
そして
package com.example.abc_etc;
...
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProducerApplicationTest {
それらを一致させた後、テストは正しく実行されました。