2

spring-boot-starter-test を使用してプロジェクト内のクラス@Serviceとクラスをテストしようとしていますが、テストしているクラスでは機能しません。@Repository@Autowired

単体テスト:

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = HelloWorldConfiguration.class
//@SpringApplicationConfiguration(classes = HelloWorldRs.class)
//@ComponentScan(basePackages = {"com.me.sbworkshop", "com.me.sbworkshop.service"})
//@ConfigurationProperties("helloworld")
//@EnableAutoConfiguration
//@ActiveProfiles("test")
// THIS CLASS IS IN src/test/java/ AND BUILDS INTO target/test-classes
public class HelloWorldTest {

    @Autowired
    HelloWorldMessageService helloWorldMessageService;

    public static final String EXPECTED = "je pense donc je suis-TESTING123";

    @Test
    public void testGetMessage() {
        String result = helloWorldMessageService.getMessage();
        Assert.assertEquals(EXPECTED, result);
    }
}

サービス:

@Service
@ConfigurationProperties("helloworld")
// THIS CLASS IS IN /src/main/java AND BUILDS INTO target/classes
public class HelloWorldMessageService {

    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String  message) {
        this.message=message;
    }

}

単体テストのコメント付きのクラス注釈は、これを機能させるために私が試みたさまざまなことを表しています。テスト パッケージとプロジェクト パッケージは同じパッケージ パスにあり@ComponentScan、エントリ ポイント (@RestControllerメイン メソッドを持つクラス) から正常に動作します。私のクラスでは src/main/java 側の service@ComponentScanとは問題ありませんが、テストでは問題ありません。を機能させるには、クラスにとして再度追加する必要があります。それ以外の場合、クラスは問題なくスコープ内にあり、テストから問題なく参照およびインスタンス化できます。問題は、テスト ランナーのクラスパス (この場合は /target/test-classes と /target/classes) の複数のエントリを正しくトラバースしていないように見えることです。@Autowire@RestController@Bean@Configuration@Autowired@ComponentScan

私が使用している IDE は IntelliJ IDEA 13 です。

更新- ここに HelloWorldRs とその構成があります:

@RestController
@EnableAutoConfiguration
@ComponentScan
public class HelloWorldRs {

    //    SPRING BOOT ENTRY POINT - main() method
    public static void main(String[] args) {
        SpringApplication.run(HelloWorldRs.class);
    }

    @Autowired
    HelloWorldMessageService helloWorldMessageService;

    @RequestMapping("/helloWorld")
    public String helloWorld() {
        return helloWorldMessageService.getMessage();
    }

}

...

@Configuration
public class HelloWorldConfiguration {

    @Bean
    public Map<String, String> map() {
        return new HashMap<>();
    }

    // This bean was manually added as a workaround to the @ComponentScan problem
    @Bean
    public HelloWorldMessageService helloWorldMessageService() {
        return new HelloWorldMessageService();
    }

    // This bean was manually added as a workaround to the @ComponentScan problem
    @Bean
    public HelloWorldRs helloWorldRs() {
        return new HelloWorldRs();
    }
}
4

2 に答える 2

2

これが解決策になるかどうかはわかりませんが、デフォルトのパッケージを使用しないでください (つまり、*.java を "src/main/java" に直接配置しないでください)。@ComponentScanまたは@EnableAutoConfigurationデフォルトのパッケージで。クラスパス上のすべてのもの (すべての Spring ライブラリを含む) をスキャンしようとするため、起動時にアプリケーションを強制終了することになります。

于 2014-05-17T05:45:01.013 に答える