เขียน matcher ใน mockito

ผมอยากจะทำอะไรแบบ

verify(myObject).myMethod(new int[][] { new int[] {2,3}, new int[] {1}});

คือจะ verify โดย parameter เป็น array 2 มิติ มันเจ๊งเพราะปกติ Mockito มันไปเรียน Arrays.equals ผมอยากจะให้มันเปรียบเทียบแบบลึกๆ คือใช้ Arrays.deepEquals แทน แต่ว่าเปลี่ยนที่ไหน? … ผมหาใน API หาไม่เจอ (มันอาจจะมีเพียงแต่หาไม่เจอ) เลยดูตัวอย่างจาก AdditionalMatcher แล้วเขียนตาม ได้แบบนี้

import java.util.Arrays;
import org.mockito.ArgumentMatcher;
import org.mockito.internal.matchers.ArrayEquals;
import org.mockito.internal.progress.HandyReturnValues;
import org.mockito.internal.progress.MockingProgress;
import org.mockito.internal.progress.ThreadSafeMockingProgress;

class DeepArrayEquals extends ArrayEquals {
	public DeepArrayEquals(Object wanted) {
		super(wanted);
	}

	@Override
	public boolean matches(Object actual) {
		Object wanted = getWanted();
		return Arrays.deepEquals((int[][]) wanted, (int[][]) actual);
	}
}

class CustomizedMatcher {
	private static MockingProgress mockingProgress = new ThreadSafeMockingProgress();

	private static HandyReturnValues reportMatcher(ArgumentMatcher matcher) {
		return mockingProgress.getArgumentMatcherStorage().reportMatcher(
				matcher);
	}

	public static int[][] ary2d(int[][] ary) {
		return reportMatcher(new DeepArrayEquals(ary)).returnNull();
	}
}

เวลาใช้ก็ใช้แบบนี้

verify(myObject).myMethod(CustomizedMatcher.ary2d(new int[][] { new int[] {2,3}, new int[] {1}}));

เอาไปครอบๆ ไว้เป็นอันใช้ได้

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s