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 を使用しないのはなぜですか? 回答: 統合テストではなく、コンポーネント ベースのテストを行いたいためです。