⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 invocationmockerbuilder.java

📁 不管是测试驱动开发或者是其它的开发模式
💻 JAVA
字号:
/*  Copyright (c) 2000-2004 jMock.org
 */
package org.jmock.builder;

import java.lang.reflect.Method;
import junit.framework.AssertionFailedError;
import org.jmock.core.Constraint;
import org.jmock.core.InvocationMatcher;
import org.jmock.core.Stub;
import org.jmock.core.StubMatchersCollection;
import org.jmock.core.matcher.*;
import org.jmock.core.stub.VoidStub;


public class InvocationMockerBuilder
        implements NameMatchBuilder
{
    private StubMatchersCollection mocker;
    private BuilderNamespace builderNamespace;
    private Class mockedType;

    public InvocationMockerBuilder( StubMatchersCollection mocker,
                                    BuilderNamespace idTable,
                                    Class mockedType )
    {
        this.mocker = mocker;
        this.builderNamespace = idTable;
        this.mockedType = mockedType;
    }

    public ArgumentsMatchBuilder method( Constraint nameConstraint ) {
        return addMatcher(new MethodNameMatcher(nameConstraint));
    }

    public ArgumentsMatchBuilder method( String name ) {
        checkLegalMethodName(name);
        checkExistingMethodName(name);

        addMatcher(new MethodNameMatcher(name));
        builderNamespace.registerMethodName(name, this);

        return this;
    }

    private void checkLegalMethodName( String name ) {
        if( !isLegalMethodName(name) ) {
            throw new IllegalArgumentException("illegal method name: " + name + " is not a legal Java identifier");
        }
    }

    private boolean isLegalMethodName( String name ) {
        if( !Character.isJavaIdentifierStart(name.charAt(0)) ) return false;
        for( int i = 1; i < name.length(); i++ ) {
            if( !Character.isJavaIdentifierPart(name.charAt(i))) return false;
        }
        return true;
    }

    private void checkExistingMethodName( String name ) {
        if( !typeDefinesMethodNamed(name) ) {
            throw new AssertionFailedError("no method named " + name + " is defined in type "+mockedType);
        }
    }

    private boolean typeDefinesMethodNamed( String name ) {
        Method[] methods = mockedType.getMethods();
        
        for( int i = 0; i < methods.length; i++ ) {
            if( methods[i].getName().equals(name) ) return true;
        }
        return false;
    }

    public MatchBuilder match( InvocationMatcher customMatcher ) {
        return addMatcher(customMatcher);
    }

    public MatchBuilder with( Constraint arg1 ) {
        return with(new Constraint[]{arg1});
    }

    public MatchBuilder with( Constraint arg1, Constraint arg2 ) {
        return with(new Constraint[]{arg1, arg2});
    }

    public MatchBuilder with( Constraint arg1, Constraint arg2, Constraint arg3 ) {
        return with(new Constraint[]{arg1, arg2, arg3});
    }

    public MatchBuilder with( Constraint arg1, Constraint arg2, Constraint arg3, Constraint arg4 ) {
        return with(new Constraint[]{arg1, arg2, arg3, arg4});
    }

    public MatchBuilder with( Constraint[] constraints ) {
        return addMatcher(new ArgumentsMatcher(constraints));
    }

    public MatchBuilder withNoArguments() {
        return addMatcher(NoArgumentsMatcher.INSTANCE);
    }

    public MatchBuilder withAnyArguments() {
        return addMatcher(AnyArgumentsMatcher.INSTANCE);
    }

    public IdentityBuilder will( Stub stubAction ) {
        setStub(stubAction);
        return this;
    }

    public IdentityBuilder isVoid() {
        setStub(VoidStub.INSTANCE);
        return this;
    }

    private void setStub( Stub stubAction ) {
        mocker.setStub(stubAction);
    }

    public IdentityBuilder expect( InvocationMatcher expectation ) {
        return addMatcher(expectation);
    }

    public void id( String invocationID ) {
        mocker.setName(invocationID);
        builderNamespace.registerUniqueID(invocationID, this);
    }

    public MatchBuilder after( String priorCallID ) {
        setupOrderingMatchers(builderNamespace, priorCallID, priorCallID);
        return this;
    }

    public MatchBuilder after( BuilderNamespace otherMock, String priorCallID ) {
        setupOrderingMatchers(otherMock, priorCallID, priorCallID + " on " + otherMock);
        return this;
    }

    private void setupOrderingMatchers( BuilderNamespace idTable,
                                        String priorCallID,
                                        String priorCallDescription ) {
        MatchBuilder priorCallBuilder = idTable.lookupID(priorCallID);

        if (priorCallBuilder == this) {
            throw new AssertionFailedError("confusing identifier of prior invocation \"" + priorCallID + "\"; " +
                                           "give it an explicit call identifier");
        }

        InvokedRecorder priorCallRecorder = new InvokedRecorder();

        priorCallBuilder.match(priorCallRecorder);

        mocker.addMatcher(new InvokedAfterMatcher(priorCallRecorder,
                                                  priorCallDescription));
    }

    private InvocationMockerBuilder addMatcher( InvocationMatcher matcher ) {
        mocker.addMatcher(matcher);
        return this;
    }
}

⌨️ 快捷键说明

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