Я сейчас занимаюсь разработкой микросервиса, который регистрирует пользователей в системе. Я хотел создать несколько интеграционных тестов для моего контроллера, но столкнулся с некоторой проблемой с 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
. Любая помощь приветствуется, может быть, такой подход бессмыслен, тогда приветствуются и другие предложения.