corner.transaction.services.impl.JpaTransactionDecoratorImplTest.java Source code

Java tutorial

Introduction

Here is the source code for corner.transaction.services.impl.JpaTransactionDecoratorImplTest.java

Source

/* 
 * Copyright 2009 The Corner Team.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package corner.transaction.services.impl;

import org.apache.tapestry5.ioc.Registry;
import org.apache.tapestry5.ioc.services.AspectDecorator;
import org.apache.tapestry5.ioc.test.IOCTestCase;
import org.easymock.EasyMock;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAttribute;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import org.springframework.transaction.support.SimpleTransactionStatus;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import corner.transaction.TransactionModule;
import corner.transaction.services.TransactionAdvisor;
import corner.transaction.services.TransactionDecorator;
import corner.transaction.services.impl.SpringTransactionAdvisor;

/**
 * @author <a href="mailto:jun.tsai@gmail.com">Jun Tsai</a>
 * @since 0.1
 */
public class JpaTransactionDecoratorImplTest extends IOCTestCase {
    private Registry registry;

    private AspectDecorator aspectDecorator;

    @BeforeClass
    public void setup() {
        registry = buildRegistry();

        aspectDecorator = registry.getService(AspectDecorator.class);
    }

    @AfterClass
    public void shutdown() {
        registry.shutdown();

        aspectDecorator = null;
        registry = null;
    }

    @Test
    public void undecorated() {
        VoidService delegate = newMock(VoidService.class);
        PlatformTransactionManager transactionManager = newMock(PlatformTransactionManager.class);
        TransactionInterceptor transactionInterceptor = TransactionModule
                .buildTransactionInterceptor(transactionManager);
        TransactionAdvisor advisor = new SpringTransactionAdvisor(transactionInterceptor);
        TransactionDecorator decorator = new TransactionDecoratorImpl(aspectDecorator, advisor);
        VoidService interceptor = decorator.build(VoidService.class, delegate, "foo.Bar");

        delegate.undecorated();

        replay();
        interceptor.undecorated();
        verify();
    }

    @Test
    public void void_method() {
        VoidService delegate = newMock(VoidService.class);
        PlatformTransactionManager transactionManager = newMock(PlatformTransactionManager.class);
        TransactionInterceptor transactionInterceptor = TransactionModule
                .buildTransactionInterceptor(transactionManager);
        TransactionAdvisor advisor = new SpringTransactionAdvisor(transactionInterceptor);
        TransactionDecorator decorator = new TransactionDecoratorImpl(aspectDecorator, advisor);
        VoidService interceptor = decorator.build(VoidService.class, delegate, "foo.Bar");

        TransactionStatus transactionStatus = new SimpleTransactionStatus();
        expect(transactionManager.getTransaction(EasyMock.isA(TransactionAttribute.class)))
                .andReturn(transactionStatus);//TransactionDefinition.PROPAGATION_REQUIRED);
        transactionManager.commit(transactionStatus);

        delegate.voidMethod();

        replay();
        interceptor.voidMethod();
        verify();

    }

    public interface VoidService {
        void undecorated();

        @Transactional
        void voidMethod();

        @Transactional
        void voidMethodWithParam(long id);
    }
}