0

NoSqlUnit を使用してメモリ内 MongoDB (Fongo) データベースを使用したい arquillian コンポーネント テストがあります。@Producer を使用して DataStoreConnection を定義し、Java SE 8 で Eclipse MicroProfile を使用しています。

問題は、メモリ内 DB を開始した後、エンドポイント テストを実行するときに、コードでプログラムからアクセスできないことです。

私はそのような DataStoreConnectionProducer を持っています:

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;


@ApplicationScoped
public class DataStoreConnectionProducer {
    private MongoClient mongoClient;

    private static final Config config = ConfigProvider.getConfig();

    @Produces
    public MongoDatabase createMongoClient(){
        final String DB_PATH    = config.getValue( "mongodb.path", String.class );
        final int DB_PORT       = config.getValue( "mongodb.port", Integer.class );
        final String DB_NAME    = config.getValue( "mongodb.dbname", String.class );

        if( DB_NAME.equals( "test" ) )
            return new MongoClient().getDatabase(DB_NAME);
        else
            return new MongoClient( DB_PATH, DB_PORT ).getDatabase( DB_NAME );

    }
}

私の GreetingDAO は、MongoDatabase を使用して注入しています

@Inject MongoDatabase mongoDatabase;

私のリソースは次のようになります。

@Path( "/greetings" )
public class HelloResource {

    @Inject
    private GreetingDAO greetingDAO;

    @Inject
    private GreetingService greetingService;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getGreeting (){
        return Response.ok(greetingDAO.findAll(), MediaType.APPLICATION_JSON).build();
    }

    @GET
    @Path( "{id}" )
    @Produces( MediaType.APPLICATION_JSON )
    public Response getGreetingById( @PathParam( "id" ) String greetingId ){
        try {
            return Response.ok( greetingDAO.findByID( greetingId.toLowerCase() ), MediaType.APPLICATION_JSON ).build();
        }catch ( NoSuchElementException ex ){
            ex.printStackTrace();
            return Response.status( 404 ).build();
        }
    }

最後に私の Arquillian テスト:

    @RunWith( Arquillian.class )
    @RunAsClient
    public class HelloResourceTest extends AbstractTest{

        private static final String DB_NAME     = "test";

        @ClassRule
        public static final InMemoryMongoDb inMemoryMongoDb =
                newInMemoryMongoDbRule().targetPath( "localhost" ).build();
        @Rule
        public MongoDbRule embeddedMongoDbRule = newMongoDbRule()
                .defaultEmbeddedMongoDb(DB_NAME);

        @Inject MongoClient mongoClient;

        @Deployment
        public static WebArchive createDeployment () {
            WebArchive war = createBasicDeployment()
                    .addClasses(
                        HelloResource.class,
                        GreetingDAO.class,
                        GreetingService.class,
                        Greeting.class,
                        DAO.class,
                        DataStoreConnectionProducer.class
                    );
            System.out.println( war.toString(true) );
            return war;
        }

        private MongoDatabase getFongoDataBase(){
            return mongoClient.getDatabase( DB_NAME );
        }

これは私が混乱し始めるところです.. Fongo がインメモリ DB であることを知っているので、それにリモートでアクセスする方法はありませんか? むしろ、管理対象の MongoDB に接続しようとしている @Producer ではなく、FongoDB が使用されるように、それを DataStoreConnectionProducer に提供するか、何らかの方法で GreetingDAO に挿入する必要があります。

あなたが尋ねるかもしれない質問: 管理された MongoDB を使用しないのはなぜですか? 回答: 統合テストではなく、コンポーネント ベースのテストを行いたいためです。

4

1 に答える 1