Интеграционный тест микросервиса с Feign, OAuth2 и Spock - PullRequest
0 голосов
/ 03 ноября 2019

Я сейчас занимаюсь разработкой микросервиса, который регистрирует пользователей в системе. Я хотел создать несколько интеграционных тестов для моего контроллера, но столкнулся с некоторой проблемой с OAuth2 и Feign. Дело в том, что у моего метода контроллера (который я хочу протестировать) есть какой-то сервисный вызов, и внутри этого сервиса также есть вызов симулировать интерфейс клиента, который указывает на другой микросервис. Но в этот момент, когда вызывается симуляция, я получаю отказ в доступе через OAuth2. Есть ли способ полностью заглушить / смоделировать этот метод, чтобы при попытке вызова метода из интерфейса feign он возвращал некоторые поддельные данные?

Вот мой метод контроллера:

    @PostMapping
    public UserDto register(@Valid @RequestBody AccountRegisterRequest request) {
        return accountService.register(accountRegisterRequestConverter.convertTo(request));
    }

Вот мой метод обслуживания учетной записи register:

    public UserDto register(Account account) {
        UserDto createdUser = authServiceFeignClient.createUser(account.getUserRegistrationDto());
        if (nonNull(createdUser)) {
            account.setUserId(Long.parseLong(createdUser.getId()));
            Account savedAccount = repository.save(account);
            System.out.println("Account saved: " + savedAccount.getNickname());
        } else {
            System.out.println("Account saving error! User was not created.");
        }
        return createdUser;
    }

А также authServiceFeignClient:

@FeignClient(name = "auth-service", configuration = FeignConfiguration.class)
public interface AuthServiceFeignApi {

    @PostMapping(value = "/uaa/user")
    UserDto createUser(@RequestBody UserRegistrationDto user);
}

А вот моя конфигурация теста и сам тест, написанный на Споке:

class AccountIntegrationSpec extends MicroserviceIntegrationSetup implements AccountFixture {

    @Autowired
    AccountController accountController

    @Autowired
    AccountService accountService

    @Autowired
    AccountValidator accountValidator

    def setup() {
        stubForCreatingDefaultUser()
    }

    def 'should create user and receive result'() {
        given:
        def createAccountRequest = createAccountRegisterRequest()

        when:
        def result = accountController.register(createAccountRequest)

        then:
        result.username == "Username"
        result.id == "1"

    }
}
@CompileStatic
@SpringBootTest(classes = AccountServiceApplication.class, webEnvironment = RANDOM_PORT)
@Import(Stubs)
@ActiveProfiles("test")
abstract class MicroserviceIntegrationSetup extends Specification {

    @Autowired
    DatabaseCleaner databaseCleaner

    @Autowired
    @Qualifier("authFeignApi")
    AuthServiceFeignApi authServiceFeignApi

    @Before
    def cleanDatabase() {
        databaseCleaner.deleteAll()
    }

    @TestConfiguration
    static class Stubs {
        DetachedMockFactory factory = new DetachedMockFactory()

        @Bean(name = "authFeignApi")
        AuthServiceFeignApi authServiceFeignApi() {
            factory.Mock(AuthServiceFeignApi)
        }
    }

    def stubForCreatingUser(UserRegistrationDto userRegistrationDto) {
        authServiceFeignApi.createUser(userRegistrationDto) >> new UserDto("1", userRegistrationDto.username)
    }

    def stubForCreatingDefaultUser() {
        authServiceFeignApi.createUser(_ as UserRegistrationDto) >> new UserDto("1", "Username")
    }

}

Подводя итог, хотелось бы, чтобы этот тест прошел, и он полностью игнорировал oauth2, а также authServiceFeignClient правильно задан / смоделирован и возвращает данные, предоставленные в методе stubForCreatingDefaultUser. Любая помощь приветствуется, может быть, такой подход бессмыслен, тогда приветствуются и другие предложения.

...