The various Surrogate distributions can be downloaded from the SourceForge Surrogate Download home page.
The surrogate-core distribution contains the Surrogate core jar and the API documentation.
The surrogate-example contains example testclasses, aspects, build scripts
and third-party jars necessary for building the examples. This
also includes the AspectJ aspectjtools.jar and aspectjrt.jar
Download both distributions and unzip/untar under a common parent directory
on your hard-drive, e.g. C:\surrogate.
It is assumed that you already have Ant installed. It can be downloaded from apache.org
surrogate-example/lib folder
to your $ANT_HOME/lib directory.
surrogate-example/lib folder
to your $ANT_HOME/lib directory.
As a test, you should now be able to build and run the test in the surrogate-example folder by
ant -Dsurrogate.debug=true
Copy the surrogate.jar, mockobjects-core.jar and aspectjrt.jar
to your projects lib folder.
The build_quickstart.xml Ant script contains an example of how to set up your project to switch between Surrogate and "normal" build. I.e set the following in your project's init target:
<target name="init">
<property name="SOURCE_DIR" value="src/java" />
<property name="TESTSOURCE_DIR" value="src/test" />
<property name="ASPECTSOURCE_DIR" value="src/aspects" />
<!-- surrogate.jar, mockobjects.jar and aspectjrt.jar must be in "lib" -->
<!-- aspectjtools.jar must be in $ANT_HOME/lib -->
<path id="compile.path">
<fileset dir="lib">
<include name="*.jar"/>
</fileset>
</path>
</target>
Add the following compilerargs to your projects compile target:
<!-- Switches compiler and "classes" dir if -Dsurrogate=true -->
<target name="init.surrogate" if="surrogate">
<property name="AJC" value="org.aspectj.tools.ant.taskdefs.Ajc11CompilerAdapter"/>
<property name="build.compiler" value="${AJC}"/>
<property name="CLASSES_DIR" value="woven-classes"/>
</target>
<target name="noinit.surrogate" unless="surrogate">
<property name="CLASSES_DIR" value="classes"/>
</target>
<target name="check.surrogate" depends="init.surrogate,noinit.surrogate"/>
<!-- Compile target -->
<target name="compile" depends="init,check.surrogate" description="compiles">
<mkdir dir="${CLASSES_DIR}"/>
<javac srcdir="${SOURCE_DIR}" destdir="${CLASSES_DIR}" debug="on" >
<classpath>
<path refid="compile.path"/>
</classpath>
<compilerarg compiler="${AJC}" line="-Xreweavable"/>
<compilerarg compiler="${AJC}" line="-Xsrcdir ${ASPECTSOURCE_DIR}"/>
</javac>
</target>
Create the file MySurrogateCalls.java in the src/aspects folder and
insert the following:
import net.sf.surrogate.core.SurrogateCalls;
aspect MySurrogateCalls extends SurrogateCalls {
protected pointcut mockPointcut() :
(
call (java.io.*Reader.new(..)) ||
call(* java.lang.System.currentTimeMillis())
);
}
Assuming that you already have a clean and test target, compile and run the
tests with:
ant clean test (runs without Surrogate)
ant -Dsurrogate=true -Dsurrogate.debug=true clean test (runs with Surrogate)
In the last run, Surrogate will report possible calls where you can
insert a mock, e.g. all calls to System.currentTimeMillis or
creation of java.io.Reader objects.
The Surrogate User Guide describes how to start injecting mock objects and mock methods.