/*
* Copyright 2004-2015 the Seasar Foundation and the Others.
*
* 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 org.seasar.framework.unit.impl;
import java.lang.reflect.Method;
import java.util.List;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.seasar.framework.aop.interceptors.MockInterceptor;
import org.seasar.framework.container.AspectDef;
import org.seasar.framework.unit.EasyMockTestCase;
import org.seasar.framework.unit.InternalTestContext;
import org.seasar.framework.unit.annotation.EasyMock;
import org.seasar.framework.unit.annotation.EasyMockType;
import org.seasar.framework.unit.annotation.Mock;
import org.seasar.framework.unit.annotation.Mocks;
import org.seasar.framework.unit.annotation.PostBindFields;
import org.seasar.framework.unit.annotation.PreUnbindFields;
import org.seasar.framework.unit.annotation.Prerequisite;
import org.seasar.framework.unit.annotation.RootDicon;
import org.seasar.framework.unit.annotation.TxBehavior;
import org.seasar.framework.unit.annotation.TxBehaviorType;
import org.seasar.framework.util.tiger.ReflectionUtil;
import static org.easymock.EasyMock.*;
/**
* @author taedium
*
*/
public class AnnotationTestIntrospectorTest extends EasyMockTestCase {
private AnnotationTestIntrospector introspector = new AnnotationTestIntrospector();
@EasyMock(EasyMockType.STRICT)
private InternalTestContext context;
/**
* @throws Exception
*/
public void testBeforeClassMethods() throws Exception {
List<Method> methods = introspector.getBeforeClassMethods(Hoge.class);
assertEquals(2, methods.size());
Method method = ReflectionUtil.getDeclaredMethod(Hoge.class, "aaa");
assertTrue(methods.contains(method));
method = ReflectionUtil.getDeclaredMethod(Hoge.class, "bbb");
assertTrue(methods.contains(method));
}
/**
* @throws Exception
*/
public void testAfterClassMethods() throws Exception {
List<Method> methods = introspector.getAfterClassMethods(Hoge.class);
assertEquals(2, methods.size());
Method method = ReflectionUtil.getDeclaredMethod(Hoge.class, "ccc");
assertTrue(methods.contains(method));
method = ReflectionUtil.getDeclaredMethod(Hoge.class, "ddd");
assertTrue(methods.contains(method));
}
/**
* @throws Exception
*/
public void testBeforeMethods() throws Exception {
List<Method> methods = introspector.getBeforeMethods(Hoge.class);
assertEquals(2, methods.size());
Method method = ReflectionUtil.getDeclaredMethod(Hoge.class, "eee");
assertTrue(methods.contains(method));
method = ReflectionUtil.getDeclaredMethod(Hoge.class, "fff");
assertTrue(methods.contains(method));
}
/**
* @throws Exception
*/
public void testAfterMethods() throws Exception {
List<Method> methods = introspector.getAfterMethods(Hoge.class);
assertEquals(2, methods.size());
Method method = ReflectionUtil.getDeclaredMethod(Hoge.class, "ggg");
assertTrue(methods.contains(method));
method = ReflectionUtil.getDeclaredMethod(Hoge.class, "hhh");
assertTrue(methods.contains(method));
}
/**
* @throws Exception
*/
public void testPostBindFieldsMethods() throws Exception {
List<Method> methods = introspector
.getPostBindFieldsMethods(Hoge.class);
assertEquals(1, methods.size());
Method method = ReflectionUtil.getDeclaredMethod(Hoge.class, "lll");
assertTrue(methods.contains(method));
method = ReflectionUtil.getDeclaredMethod(Hoge.class, "postBindFields");
assertFalse(methods.contains(method));
}
/**
* @throws Exception
*/
public void testPreUnbindFieldsMethods() throws Exception {
List<Method> methods = introspector
.getPreUnbindFieldsMethods(Hoge.class);
assertEquals(1, methods.size());
Method method = ReflectionUtil.getDeclaredMethod(Hoge.class, "mmm");
assertTrue(methods.contains(method));
method = ReflectionUtil
.getDeclaredMethod(Hoge.class, "preUnbindFields");
assertFalse(methods.contains(method));
}
/**
* @throws Exception
*/
public void testTestMethods() throws Exception {
List<Method> methods = introspector.getTestMethods(Hoge.class);
assertEquals(2, methods.size());
Method method = ReflectionUtil.getDeclaredMethod(Hoge.class, "iii");
assertTrue(methods.contains(method));
method = ReflectionUtil.getDeclaredMethod(Hoge.class, "jjj");
assertTrue(methods.contains(method));
}
/**
*
*/
public void testNeedsTransaction() {
Class<?> clazz = MethodTxBehavior.class;
Method method = ReflectionUtil.getDeclaredMethod(clazz, "aaa");
assertTrue(introspector.needsTransaction(clazz, method));
method = ReflectionUtil.getDeclaredMethod(clazz, "bbb");
assertTrue(introspector.needsTransaction(clazz, method));
method = ReflectionUtil.getDeclaredMethod(clazz, "ccc");
assertTrue(introspector.needsTransaction(clazz, method));
method = ReflectionUtil.getDeclaredMethod(clazz, "ddd");
assertFalse(introspector.needsTransaction(clazz, method));
clazz = NoneClassTxBehavior.class;
method = ReflectionUtil.getDeclaredMethod(clazz, "aaa");
assertFalse(introspector.needsTransaction(clazz, method));
method = ReflectionUtil.getDeclaredMethod(clazz, "bbb");
assertTrue(introspector.needsTransaction(clazz, method));
method = ReflectionUtil.getDeclaredMethod(clazz, "ccc");
assertTrue(introspector.needsTransaction(clazz, method));
method = ReflectionUtil.getDeclaredMethod(clazz, "ddd");
assertFalse(introspector.needsTransaction(clazz, method));
}
/**
*
*/
public void testRequiresTransactionCommitment() {
Class<?> clazz = MethodTxBehavior.class;
Method method = ReflectionUtil.getDeclaredMethod(clazz, "aaa");
assertFalse(introspector.requiresTransactionCommitment(clazz, method));
method = ReflectionUtil.getDeclaredMethod(clazz, "bbb");
assertTrue(introspector.requiresTransactionCommitment(clazz, method));
method = ReflectionUtil.getDeclaredMethod(clazz, "ccc");
assertFalse(introspector.requiresTransactionCommitment(clazz, method));
method = ReflectionUtil.getDeclaredMethod(clazz, "ddd");
assertFalse(introspector.requiresTransactionCommitment(clazz, method));
clazz = CommitClassTxBehavior.class;
method = ReflectionUtil.getDeclaredMethod(clazz, "aaa");
assertTrue(introspector.requiresTransactionCommitment(clazz, method));
method = ReflectionUtil.getDeclaredMethod(clazz, "bbb");
assertTrue(introspector.requiresTransactionCommitment(clazz, method));
method = ReflectionUtil.getDeclaredMethod(clazz, "ccc");
assertFalse(introspector.requiresTransactionCommitment(clazz, method));
method = ReflectionUtil.getDeclaredMethod(clazz, "ddd");
assertFalse(introspector.requiresTransactionCommitment(clazz, method));
}
/**
*
*/
public void testIsFulfilled() {
Aaa aaa = new Aaa();
Method method = ReflectionUtil.getDeclaredMethod(aaa.getClass(), "aaa");
boolean result = introspector.isFulfilled(aaa.getClass(), method, aaa);
assertTrue(result);
Bbb bbb = new Bbb();
method = ReflectionUtil.getDeclaredMethod(bbb.getClass(), "aaa");
result = introspector.isFulfilled(bbb.getClass(), method, bbb);
assertFalse(result);
}
/**
*
*/
public void testIsFulfilled_disabled() {
introspector.setEnablePrerequisite(false);
Bbb bbb = new Bbb();
Method method = ReflectionUtil.getDeclaredMethod(bbb.getClass(), "aaa");
boolean result = introspector.isFulfilled(bbb.getClass(), method, bbb);
assertTrue(result);
}
/**
*
*/
public void testIsIgnored() {
Method method = ReflectionUtil.getDeclaredMethod(Ccc.class, "aaa");
assertTrue(introspector.isIgnored(method));
}
/**
*
*/
public void testIsIgnored_disabled() {
introspector.setEnableIgnore(false);
Method method = ReflectionUtil.getDeclaredMethod(Ccc.class, "aaa");
assertFalse(introspector.isIgnored(method));
}
/**
*
*/
public void testCreateMock() {
Ddd ddd = new Ddd();
Method method = ReflectionUtil.getMethod(ddd.getClass(), "aaa");
introspector.createMock(method, ddd, context);
}
/**
*
*/
public void recordCreateMock() {
context.addAspecDef(same(Hello.class), isA(AspectDef.class));
context.addMockInterceptor(isA(MockInterceptor.class));
}
/**
*
*/
public void testCreateMultiMocks() {
Ddd ddd = new Ddd();
Method method = ReflectionUtil.getMethod(ddd.getClass(), "bbb");
introspector.createMock(method, ddd, context);
}
/**
*
*/
public void recordCreateMultiMocks() {
context.addAspecDef(same(Hello.class), isA(AspectDef.class));
context.addMockInterceptor(isA(MockInterceptor.class));
context.addAspecDef(eq("hello"), isA(AspectDef.class));
context.addMockInterceptor(isA(MockInterceptor.class));
}
/**
*
*/
public void testGetRootDicon() {
Method method = ReflectionUtil.getMethod(Eee.class, "aaa");
String rootDicon = introspector.getRootDicon(Eee.class, method);
assertEquals("hoge.dicon", rootDicon);
method = ReflectionUtil.getMethod(Eee.class, "bbb");
rootDicon = introspector.getRootDicon(Eee.class, method);
assertEquals("foo.dicon", rootDicon);
}
/**
*
*/
public static class Hoge {
/**
*
*/
@BeforeClass
public static void aaa() {
}
/**
*
*/
@BeforeClass
public static void bbb() {
}
/**
*
*/
@AfterClass
public static void ccc() {
}
/**
*
*/
@AfterClass
public static void ddd() {
}
/**
*
*/
@Before
public void eee() {
}
/**
*
*/
@Before
public void fff() {
}
/**
*
*/
@After
public void ggg() {
}
/**
*
*/
@After
public void hhh() {
}
/**
*
*/
@Test
public void iii() {
}
/**
*
*/
@Test
public void jjj() {
}
/**
*
*/
public void kkk() {
}
/**
*
*/
public void before() {
}
/**
*
*/
public void after() {
}
/**
*
*/
@PostBindFields
public void lll() {
}
/**
*
*/
public void postBindFields() {
}
/**
*
*/
@PreUnbindFields
public void mmm() {
}
/**
*
*/
public void preUnbindFields() {
}
}
/**
*
*/
public static class MethodTxBehavior {
/**
*
*/
public void aaa() {
}
/**
*
*/
@TxBehavior(TxBehaviorType.COMMIT)
public void bbb() {
}
/**
*
*/
@TxBehavior(TxBehaviorType.ROLLBACK)
public void ccc() {
}
/**
*
*/
@TxBehavior(TxBehaviorType.NONE)
public void ddd() {
}
}
/**
*
*/
@TxBehavior(TxBehaviorType.NONE)
public static class NoneClassTxBehavior {
/**
*
*/
public void aaa() {
}
/**
*
*/
@TxBehavior(TxBehaviorType.COMMIT)
public void bbb() {
}
/**
*
*/
@TxBehavior(TxBehaviorType.ROLLBACK)
public void ccc() {
}
/**
*
*/
@TxBehavior(TxBehaviorType.NONE)
public void ddd() {
}
}
/**
*
*/
@TxBehavior(TxBehaviorType.COMMIT)
public static class CommitClassTxBehavior {
/**
*
*/
public void aaa() {
}
/**
*
*/
@TxBehavior(TxBehaviorType.COMMIT)
public void bbb() {
}
/**
*
*/
@TxBehavior(TxBehaviorType.ROLLBACK)
public void ccc() {
}
/**
*
*/
@TxBehavior(TxBehaviorType.NONE)
public void ddd() {
}
}
/**
*
*/
public static class Aaa {
/**
*
*/
public void aaa() {
}
}
/**
*
*/
@Prerequisite("true")
public static class Bbb {
/**
*
*/
@Prerequisite("false")
public void aaa() {
}
}
/**
*
*/
public static class Ccc {
/**
*
*/
@Ignore
public void aaa() {
}
}
/**
*
*/
public static class Ddd {
/**
*
*/
@Mock(target = Hello.class, pointcut = "greeting")
public void aaa() {
}
/**
*
*/
@Mocks( {
@Mock(target = Hello.class, pointcut = "greeting"),
@Mock(target = Hello.class, targetName = "hello", pointcut = "echo") })
public void bbb() {
}
}
/**
*
*/
@RootDicon("hoge.dicon")
public static class Eee {
/**
*
*/
public void aaa() {
}
/**
*
*/
@RootDicon("foo.dicon")
public void bbb() {
}
}
/**
*
*/
public interface Hello {
/**
* @return
*/
String greeting();
/**
* @param aaa
* @return
*/
String echo(String aaa);
}
}