web-dev-qa-db-ja.com

Spring-Boot @ serviceクラスのテスト

通常はSpringApplication.run()で呼び出される_@Service_クラスをテストしたいと思います。

サービスクラスは次のとおりです。

_@Service
@EnableConfigurationProperties(AppProperties.class)
public class MongoService {

    private static final Logger logger = LoggerFactory.getLogger(MongoService.class);

    private MongoClient mongoClient;

    private final AppProperties properties;

    @Autowired
    public MongoService(AppProperties properties) {
        this.properties = properties;
    }

    /**
     * Open connection
     */
    public void openConnection() {

        try {
            mongoClient = new MongoClient(new MongoClientURI(properties.getMongoConnectionString()));
        } catch (Exception e) {
            logger.error("Cannot create connection to Search&Browse database", e);
            throw new BackendException("Cannot create connection to Search&Browse database");
        }
    }

}
_

SpringApplication.run()で開始されたコントローラーによって呼び出された場合、MongoServiceはnullではありませんが、jUnitから試行した場合は機能しません。

だから、私はこれを試しています:

_@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = AppProperties.class)
public class MongoServiceTest {

    private static final Logger logger = LoggerFactory.getLogger(MongoServiceTest.class);

    @Autowired
    MongoService mongoService;

    @Test
    public void MongoServiceAutowired() {   
        assertNotNull(mongoService);
    }
}
_

しかし、私はこの例外を取得しています:

org.springframework.beans.factory.UnsatisfiedDependencyException:「mypackage.MongoServiceTest」という名前のBeanの作成中にエラーが発生しました:フィールド「mongoService」で表現された不満足な依存関係。ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionExceptionです:タイプ 'mypackage.services.mongo.MongoService'の修飾Beanは使用できません:autowire候補として適格なBeanが少なくとも1つ必要です。依存関係のアノテーション:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}

どんな手掛かり?私はどこで失敗していますか?

4
Andrea Girardi

AppPropertiesMongoServiceは同じパッケージに含まれていないと思います

そうでない場合は、その方法でMongoServiceを注入できます:

TestConfigurationという名前の別のクラスを作成します

@ComponentScan(basePackageClasses = {
        MongoService.class,
        AppProperties.class
})
@SpringBootApplication
public class TestConfiguration {
    public static void main(String[] args) {
        SpringApplication.run(TestConfiguration.class, args);
    }
}

そして、テストでは次のように変更します。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestConfiguration.class) 
public class MongoServiceTest {

    private static final Logger logger = LoggerFactory.getLogger(MongoServiceTest.class);

    @Autowired
    MongoService mongoService;

    @Test
    public void MongoServiceAutowired() {   
        assertNotNull(mongoService);
    }
}
4
Daniel Taub