8

私はスプリングブートアプリケーションを持っています。Junit テストを書いています。application.properties (src/main/resources/application.properties で定義) と AppConfig で構成された Status Bean (src/main/java/hello/AppConfig.java) から値を注入しようとしています。Bean が自動配線されていることがわかります (デバッガーを介して null ではありません) が、値が設定されていません。

これがapplication.propertiesです

src/main/resources/application.property s

app.name=rest-service
app.version=1.0.0-SNAPSHOT

src/main/java/hello/AppConfig.java

@Configuration
public class AppConfig {

    @Value("${app.version}")
    private String version;
    @Value("${app.name}")
    private String name;


    @Bean
    public Status status(){
        return new Status(name,version);
    }

}

//ステータスは、名前とバージョンのフィールドを持つ単純な pojo です

src/test/java/hello/GreetingControllerTests.java

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@ContextConfiguration(classes={hello.TestConfig.class,hello.AppConfig.class})
@WebAppConfiguration
public class GreetingControllerTests {


    @Autowired
    Environment envi;

    @Autowired
    Status status;

    @Value("${app.name:notConfigured}")
    String appName;

    private String env;

    @Before
    public void init(){
        System.out.println(status.getName());
        System.out.println(appName);
        env=envi.getActiveProfiles()[0];
    }

    @Test
    public void should_fail(){
        if (env.equalsIgnoreCase("DEV")){
            assertThat(false).isFalse();
        }
        if (env.equalsIgnoreCase("QA1")){
            System.out.println("failing the test");
            fail();
        }
    }
}

init メソッドでデバッガーを設定したところ、正しい値が設定された BeanappNameとBean の両方が注入されていないことがわかりました。statusただし、ステータス Bean は注入されます。値が設定されていないだけです。

4

2 に答える 2

4

プロジェクトを共有していただきありがとうございます。これにより、作業が非常に簡単になりました。私のプル リクエスト (コメント付き) を参照して、すべてが機能するようになった方法を理解してください。

https://bitbucket.org/SpringDevSeattle/gs-rest-service/pull-requests/4/updating-project-for-spring-boot-14/diff

* 更新 *一部の古い Spring アノテーションと新しいアノテーションが混在しているため、アノテーションが上書きされていました。@Autowired ではない spring-boot プロパティのクレジットは、Google の検索に基づいたソリューションを示してくれましたapplication.properties not being populated in the environment

あなたが見れば@SpringApplicationConfiguration

@ContextConfiguration(loader = SpringApplicationContextLoader.class)
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Deprecated
public @interface SpringApplicationConfiguration {

実際には、他の多くの注釈で構成されています。重要なのは@ContextConfiguration. ローダーを使用し、その@SpringApplicationConfigurationローダーはロードするコンポーネントとともに適切な構成ファイルのクラスパスをスキャンしています (1 つは application.properties を環境に読み込むものです)。テスト内で、その注釈を宣言でオーバーライドします。

@ContextConfiguration(classes={hello.TestConfig.class,hello.AppConfig.class})

これにより、Spring は、他の構成ファイルをスキャンせずに TestConfig および AppConfig クラスのみをロードするように強制されます。その注釈をコメントアウトして実行すると、テストがパスし、init() メソッドをデバッグすると、挿入された値が表示されます。

于 2016-08-12T05:51:47.457 に答える
0

テストの下のリソース ディレクトリに別のプロパティ ファイルが必要です。

/src/test/resources

それがjunitが見ているところです。

于 2016-08-11T16:49:48.510 に答える