returnstub.java

来自「不管是测试驱动开发或者是其它的开发模式」· Java 代码 · 共 82 行

JAVA
82
字号
/*  Copyright (c) 2000-2004 jMock.org
 */
package org.jmock.core.stub;

import java.util.HashMap;
import java.util.Map;
import junit.framework.Assert;
import org.jmock.core.Invocation;
import org.jmock.core.Stub;


public class ReturnStub
        extends Assert
        implements Stub
{
    private Object result;

    private static Map BOX_TYPES = new HashMap();

    static {
        BOX_TYPES.put(boolean.class, Boolean.class);
        BOX_TYPES.put(byte.class, Byte.class);
        BOX_TYPES.put(char.class, Character.class);
        BOX_TYPES.put(short.class, Short.class);
        BOX_TYPES.put(int.class, Integer.class);
        BOX_TYPES.put(long.class, Long.class);
        BOX_TYPES.put(float.class, Float.class);
        BOX_TYPES.put(double.class, Double.class);
    }


    public ReturnStub( Object result ) {
        this.result = result;
    }

    public Object invoke( Invocation invocation ) throws Throwable {
        checkTypeCompatiblity(invocation.invokedMethod.getReturnType());
        return result;
    }

    public StringBuffer describeTo( StringBuffer buffer ) {
        return buffer.append("returns <").append(result).append(">");
    }

    private void checkTypeCompatiblity( Class returnType ) {
        if (result == null) {
            if (returnType.isPrimitive()) reportInvalidNullValue(returnType);
        } else if (returnType == void.class) {
            reportReturnFromVoidMethod();
        } else {
            Class valueType = result.getClass();
            if (!isCompatible(returnType, valueType)) {
                reportTypeError(returnType, valueType);
            }
        }
    }

    private boolean isCompatible( Class returnType, Class valueType ) {
        if (returnType.isPrimitive()) {
            return isBoxedType(returnType, valueType);
        } 
        return returnType.isAssignableFrom(valueType);
    }

    private boolean isBoxedType( Class primitiveType, Class referenceType ) {
        return BOX_TYPES.get(primitiveType) == referenceType;
    }

    private void reportTypeError( Class returnType, Class valueType ) {
        fail("tried to return an incompatible value: " +
             "expected a " + returnType + " but returned a " + valueType);
    }

    private void reportInvalidNullValue( Class returnType ) {
        fail("tried to return null value from invokedMethod returning " + returnType);
    }

    private void reportReturnFromVoidMethod() {
        fail("tried to return a value from a void method");
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?