метакласс не заменяет метод экземпляра во время тестирования? - PullRequest
0 голосов
/ 27 марта 2019

Вот пример теста, который я подготовил, чтобы проверить, работает ли замена метода метакласса или нет. Ниже приведен тестируемый метод. Этот метод находится внутри 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. Может ли это нарушить мета-замену?

...