Em um anterior série de postagens em blogs Expliquei como usar TestContainers para seus testes Java Junit. Algumas das questões que não abordamos foram sobre como testar o N1QL, criar seus próprios buckets, índices etc... Esta postagem será sobre a criação de Dados do Spring Couchbase casos de teste e cobrir essas questões que deixamos de lado.
Porta não configurável de fio rígido
Uma das limitações que temos atualmente no Couchbase Server é que você não pode alterar algumas das portas padrão. Esse é um problema com o Docker, pois a alteração das portas é apenas notificada de outra forma. Isso pode ser ótimo porque significa que você pode ter várias instâncias do Couchbase em execução na mesma máquina. Mas, infelizmente, não funcionará, portanto, algumas portas terão de ser corrigidas. Isso pode ser declarado com bastante facilidade com TestContainers usando o método addFixedExposedPort.
1 2 3 4 5 6 7 8 9 10 |
@Substituir protegida vazio configurar() { addExposedPorts(8091, 11207, 11210, 11211, 18091, 18092, 18093); addFixedExposedPort(8092, 8092); addFixedExposedPort(8093, 8093); addFixedExposedPort(8094, 8094); addFixedExposedPort(8095, 8095); setWaitStrategy(novo HttpWaitStrategy (estratégia de espera)().forPath("/ui/index.html#/")); } |
Com isso resolvido, nosso Java SDK poderá se conectar ao N1QL.
Caso de teste abstrato do Spring Data Couchbase Docker
O objetivo aqui é criar um caso de teste abstrato que será usado por qualquer classe que precise de uma instância do Couchbase e do Spring Data Couchbase configurado. Ele começa como nos posts anteriores, instanciando um campo CouchbaseContainer. Como estamos testando o Spring Data, configuramos o suporte para Index, Query e vamos incluir o FTS para mais tarde.
Para garantir que essa classe executará testes para seu aplicativo, adicione o parâmetro @RunWith(SpringRunner.class)
annotation. E para garantir que a configuração do seu aplicativo seja testada, assim como a nossa configuração personalizada, adicione @SpringBootTest(classes = {GittalentBackendApplication.class, AbstractSPDataTestConfig.CouchbaseTestConfig.class})
.
Agora, falando sobre configuração personalizada, do que precisamos? Queremos substituir a configuração padrão do Couchbase do aplicativo. Para isso, precisamos implementar um CouchbaseConfigurer. Essa interface define todo o bean necessário para que o Spring Data Couchbase funcione corretamente. Ela fornece instâncias para CouchbaseEnvironment, ClusterInfo, Cluster e Bucket.
Todos eles virão de nossa configuração do CouchbaseContainer antes da execução dos testes. Portanto, precisamos nos certificar de que o contêiner esteja em execução e pronto antes de inicializar todos os beans. Isso pode ser feito adicionando um método init() anotado com @PostConstruct. Isso nos permitirá primeiro garantir que o contêiner esteja em execução e, em seguida, configurar outras coisas. No exemplo a seguir, configuramos um bucket chamado default e configuramos o tipo de índice como MOI.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
@Executar com(SpringRunner.classe) @SpringBootTest(aulas = {Aplicativo GittalentBackendApplication.classe, AbstractSPDataTestConfig.CouchbaseTestConfig.classe}) público abstrato classe AbstractSPDataTestConfig { público estático final Cordas usuário do cluster = "Administrador"; público estático final Cordas clusterPassword = "senha"; @Regra de classe público estático CouchbaseContainer couchbaseContainer = novo CouchbaseContainer() .comFTS(verdadeiro) .com índice(verdadeiro) .comQuery(verdadeiro) .comClusterUsername(usuário do cluster) .comClusterPassword(clusterPassword); @Configuração estático classe CouchbaseTestConfig implementa Configurador do Couchbase { privado CouchbaseContainer couchbaseContainer; @PostConstruct público vazio inicial() lançamentos Exceção { couchbaseContainer = AbstractSPDataTestConfig.couchbaseContainer; Configurações do balde configurações = DefaultBucketSettings.construtor() .enableFlush(verdadeiro).nome("default").cota(100).réplicas(0).tipo(Tipo de balde.BASE DE SOFÁ).construir(); configurações = couchbaseCluster().gerenciador de cluster(usuário do cluster, clusterPassword).insertBucket(configurações); couchbaseContainer.callCouchbaseRestAPI("/settings/indexes", "indexerThreads=0&logLevel=info&maxRollbackPoints=5&storageMode=memory_optimized", "Administrador", "senha"); waitForContainer(); } público vazio waitForContainer(){ Estratégia de espera do Couchbase s = novo Estratégia de espera do Couchbase(); s.comBasicCredentials(usuário do cluster, clusterPassword); s.waitUntilReady(couchbaseContainer); } @Substituir @Feijão público CouchbaseEnvironment couchbaseEnvironment() { retorno couchbaseContainer.getCouchbaseEnvironnement(); } @Substituir @Feijão público Aglomerado couchbaseCluster() lançamentos Exceção { retorno couchbaseContainer.geCouchbaseCluster(); } @Substituir @Feijão público ClusterInfo couchbaseClusterInfo() lançamentos Exceção { Aglomerado cc = couchbaseCluster(); Gerenciador de cluster gerente = cc.gerenciador de cluster(usuário do cluster, clusterPassword); retorno gerente.informações(); } @Substituir @Feijão público Balde cliente couchbase() lançamentos Exceção { retorno couchbaseContainer.geCouchbaseCluster().openBucket("default"); } } } |
Depois que tivermos esse caso de teste abstrato, tudo o que precisamos fazer é criar uma classe que o estenda e começar a escrever testes! Aqui podemos injetar serviços do nosso aplicativo, bem como um Bucket de nível inferior. O que você vê nesse teste é primeiro uma chamada para um serviço de importação que cria documentos. Em seguida, criamos um índice no bucket padrão e testamos uma consulta nele.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
público classe GitTalentGHImportTests se estende AbstractSPDataTestConfig { @Com fio automático privado GithubImportService githubImportService; @Com fio automático privado Balde balde; @Teste público vazio importDevAdvocateTeam(){ githubImportService.importOneDeveloper("ldoguin"); N1qlQueryResult resultado = balde.consulta(N1qlQuery.simples("CREATE PRIMARY INDEX ON default" (Criar índice primário sobre padrão))); N1qlQuery consulta = N1qlQuery.simples("SELECT * FROM default WHERE developerInfo.username = 'ldoguin'"); resultado = balde.consulta(consulta); N1qlQueryRow fila = resultado.linhas().próxima(); Afirmar.assertNotNull(fila); } } |
Como você pode ver, depois que o caso de teste abstrato é criado, a quantidade de código é realmente mínima e corresponde exatamente ao que você deseja testar.
[Laurent Doguin, defensor dos desenvolvedores do Couchbase, elaborou uma boa visão sobre como testar aplicativos Spring Data Couchbase com Contêineres de Teste e Spring [...]
Olá,
Estou tendo problemas ao criar vários arquivos que estendem a classe Abstract.
Você pode tentar em seu lado? Veja se há algo que estou fazendo errado...
Desde já, obrigado,
Atenciosamente,