Мне нужно выполнить удаленные вызовы от Micronaut к приложению Spring. Для создания необходимых бобов я создал Фабрику:
@Factory
public class RemotingConfig {
@Bean
@Singleton
public OfferLeadService offerLeadService(@Value("${offer.server.remoting.base.url}")
String offerRemotingBaseUrl) {
HttpInvokerProxyFactoryBean invoker = new HttpInvokerProxyFactoryBean();
invoker.setHttpInvokerRequestExecutor(new SimpleHttpInvokerRequestExecutor());
invoker.setServiceUrl(offerRemotingBaseUrl + OfferLeadService.URI);
invoker.setServiceInterface(OfferLeadService.class);
invoker.afterPropertiesSet();
return (OfferLeadService) invoker.getObject();
}
@Bean
@Singleton
public APIKeyService apiKeyService(@Value("${offer.server.remoting.base.url}")
String offerRemotingBaseUrl) {
HttpInvokerProxyFactoryBean invoker = new HttpInvokerProxyFactoryBean();
invoker.setHttpInvokerRequestExecutor(new SimpleHttpInvokerRequestExecutor());
invoker.setServiceUrl(offerRemotingBaseUrl + APIKeyService.URI);
invoker.setServiceInterface(APIKeyService.class);
invoker.afterPropertiesSet();
return (APIKeyService) invoker.getObject();
}
}
В моем тесте интеграции Spock мне нужно смоделировать эти bean-компоненты, которые я пробовал согласно документам Micronaut: https://docs.micronaut.io/latest/guide/index.html#replaces
Результатом стал такой тест:
@MicronautTest
class StackoverflowSpecification extends Specification {
@Inject
AuthorizedClient authorizedClient
@Inject
UnauthorizedClient unauthorizedClient
@Inject
OfferLeadService offerLeadService
@Inject
APIKeyService apiKeyService
@Factory
@Replaces(factory = RemotingConfig.class)
static class RemotingConfigTest extends Specification {
@Singleton
OfferLeadService offerLeadService() {
return Mock(OfferLeadService)
}
@Singleton
APIKeyService apiKeyService() {
return Mock(APIKeyService)
}
}
void "authenticated sessions request returns 200 ok"() {
when:
HttpResponse response = authorizedClient.getSession("AA-BB-CC")
then:
response.status == OK
and: 'setup mock calls'
1 * apiKeyService.find(_, _) >> buildApiKeyVO()
1 * offerLeadService.containsHipHavingPostalCode(_, _) >> true
0 * _
}
void "authenticated sessions request with wrong passphrase returns 403 forbidden"() {
when:
unauthorizedClient.getSessionWithWrongPassphrase("AA-BB-CC")
then:
HttpClientResponseException ex = thrown(HttpClientResponseException)
then:
ex.status == FORBIDDEN
and: 'setup mock calls'
1 * apiKeyService.find(_, _) >> buildApiKeyVO()
1 * offerLeadService.containsHipHavingPostalCode(_, _) >> false
0 * _
}
private static APIKeyVO buildApiKeyVO() {
APIKeyVO key = new APIKeyVO()
key.setId(1L)
key.setValue("123")
key.setEnabled(true)
key.setRoles(List.of("ROLE_STANDARD"))
key.setValidUntil(Instant.now().plus(100, ChronoUnit.DAYS))
key.setDescription("CBC App")
key.setAccountId("CBC")
return key
}
}
Это решение не работает. Два теста проходят успешно, если они выполняются изолированно, однако выполнение обоих из них приводит к сбою второго теста (порядок здесь уместен, поэтому, если бы второй тест был на вершине, это был бы один проход).
При выполнении обоих тестов и отладки я вижу, что, как только в первом тесте были вызваны две ложные реплики, все последующие обращения к имитам приводят к null
и false
соответственно, несмотря на указание чего-то еще.
Как мне посмеяться над двумя бобами, указанными с помощью RemotingConfig
в интеграционном тесте?