Вот пример теста, который я подготовил, чтобы проверить, работает ли замена метода метакласса или нет. Ниже приведен тестируемый метод. Этот метод находится внутри PaymentController.
Пожалуйста, посмотрите на строку
CreateTransactionResponse tresponse = controller.getApiResponse();
в коде. В тестовом коде я использую метакласс для замены метода getApiResponse ().
def justTest(){
def descriptor = params['dataDescriptor']
def value = params['dataValue']
String firstName = params[AuthNetField.X_FIRST_NAME.fieldName]
String lastName = params[AuthNetField.X_LAST_NAME.fieldName]
String address = params[AuthNetField.X_ADDRESS.fieldName]
String city = params[AuthNetField.X_CITY.fieldName]
String state = params[AuthNetField.X_STATE.fieldName]
String zip = params[AuthNetField.X_ZIP.fieldName]
String country = params[AuthNetField.X_COUNTRY.fieldName]
String phone = params[AuthNetField.X_PHONE.fieldName]
String email = params[AuthNetField.X_EMAIL.fieldName]
String apiLoginId = grailsApplication.config.net.authorize.apiLoginId
if (grailsApplication.config.net.authorize.environment == net.authorize.Environment.PRODUCTION){
ApiOperationBase.setEnvironment(Environment.PRODUCTION);
}
else{
ApiOperationBase.setEnvironment(Environment.SANDBOX);
}
String transactionKey = grailsApplication.config.net.authorize.transactionKey
MerchantAuthenticationType merchantAuthenticationType = new MerchantAuthenticationType() ;
merchantAuthenticationType.setName(apiLoginId);
merchantAuthenticationType.setTransactionKey(transactionKey);
ApiOperationBase.setMerchantAuthentication(merchantAuthenticationType);
// Populate the payment data
PaymentType paymentType = new PaymentType();
OpaqueDataType OpaqueData = new OpaqueDataType();
OpaqueData.setDataDescriptor(descriptor);
OpaqueData.setDataValue(value);
paymentType.setOpaqueData(OpaqueData);
CustomerDataType cdt = new CustomerDataType()
cdt.setEmail(email)
// Create the payment transaction request
TransactionRequestType txnRequest = new TransactionRequestType();
txnRequest.setTransactionType(TransactionTypeEnum.AUTH_CAPTURE_TRANSACTION.value());
txnRequest.setPayment(paymentType);
txnRequest.setCustomer(cdt)
txnRequest.setAmount(5);
// Make the API Request
CreateTransactionRequest apiRequest = new CreateTransactionRequest();
apiRequest.setTransactionRequest(txnRequest);
CreateTransactionController controller = new CreateTransactionController(apiRequest);
controller.execute();
CreateTransactionResponse tresponse = controller.getApiResponse();
render "hello"
}
Вот интеграционный тест, в котором я заменяю метод getApiResponse () класса CreateTransactionController. При запуске теста эта замена не происходит, т. Е. Он не печатает «попал сюда ...». Поэтому я ценю любое руководство о том, почему эта замена не работает. Я ценю любую помощь. Спасибо!
@Test
void test(){
PaymentController pc = new PaymentController()
CreateTransactionController.metaClass.getApiResponse = {
println "got here..."
}
pc.justTest()
}
UPDATE:
Это странно.
Я изменил justTest на другой фрагмент тестового кода authorize.net.
def justTest(){
String apiLoginId = grailsApplication.config.net.authorize.apiLoginId
String transactionKey = grailsApplication.config.net.authorize.transactionKey
def voidTransactionResponse = new TransactionResponse()
net.authorize.aim.Result<net.authorize.aim.Transaction> voidResult
Merchant merchant = Merchant.createMerchant(grailsApplication.config.net.authorize.environment, apiLoginId, transactionKey)
net.authorize.aim.Transaction transaction = merchant.createAIMTransaction(net.authorize.TransactionType.VOID, new BigDecimal(2))
transaction.transactionId = "324234234"
voidResult = merchant.postTransaction(transaction)
render "hello"
}
вот мета замена кода теста.
PaymentController pc = new PaymentController()
Merchant.metaClass.postTransaction = { net.authorize.Transaction transaction ->
println "asd"
}
pc.justTest()
Вот это работает. то есть println asd выполняется. Другими словами, метод Merchant postTransaction заменяется. Поэтому мне интересно, почему замена работает в классе Merchant, а не в классе CreateTransactionController. Я ценю любые идеи. Спасибо!
UPDATE2:
Я хотел бы отметить одну вещь: библиотека authorize.net была загружена как jar и добавлена в папку lib. Таким образом, библиотека не разрешается из файла BuildConfig. Это связано с тем, что используемая среда Grails старая 2.2, а библиотека новая, поэтому, поскольку ее не было в репозитории, ее необходимо было загрузить в виде jar и добавить в папку lib. Может ли это нарушить мета-замену?