public void run() {
		PrintStream printStreamOriginal = System.out;
		System.setOut(new PrintStream(new OutputStream(){ public void write(int b) { } }));
		
		testResult = new TestResult(expectedResult, false);

		try {
			// if the target is a String, it's actually a Class
			target = (target instanceof String) ? Class.forName((String)target) : target;
			
			if(tester instanceof ObjectEqualityTester) {
				testResult = ((ObjectEqualityTester)tester).test(expectedResult, target);
			} else {
				testResult = tester.test(expectedResult, target, getMethod(), args);	
			}
			
			actualResult = testResult.getResult();
		} catch(IllegalArgumentException e) {
			failureMessage = "[tester error]: illegal number or type of arguments passed to " + methodSignature();
		} catch(NoSuchMethodException e) {
			failureMessage = "[tester error]: method " + methodSignature() + " does not exist";
		} catch(IllegalAccessException e) {
			failureMessage = "[tester error]: tried to access private or protected method " + methodSignature();
		} catch(SecurityException e) {
			failureMessage = "[tester error]: tried accessing private or protected method" + methodSignature();
		} catch(ClassNotFoundException e) {
			failureMessage = "[tester error]: class does not exist" + methodSignature();
		} catch(InvocationTargetException e) {
			// errors produced by the actual code
			failureMessage = "[error]: method " + methodWithParameters() + " expected <" + toString(expectedResult) + ">, but got <" + e.getTargetException().getClass().toString() + ">";
		} catch(Exception e) {
			failureMessage = "[tester error]: uncaught exception " + e.getLocalizedMessage();
			e.printStackTrace();
		} finally {
			System.setOut(printStreamOriginal);
		}
	}