JMock State

import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.States;
import org.jmock.integration.junit4.JMock;
import org.jmock.integration.junit4.JUnit4Mockery;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;


interface Sender {
	public void sendFirst();
	public void send();
}
class Target {
	private Sender sender;
	private boolean called = false;
	
	public Target(Sender sender) {
		this.sender = sender;
	}
	
	public void execute() {
		if (!called) {
			sender.sendFirst();
			this.called = true;
		} else {
			sender.send();
		}	
	}
}

@RunWith(JMock.class)
public class JMockSampleTest {
	Mockery context = new JUnit4Mockery();
	States targetState = context.states("target");
	
	@Test
	public void callSendIfexecuteWhenCalled() {
		final Sender mock = context.mock(Sender.class);
		Target target = new Target(mock);
		context.checking(new Expectations() {{
			allowing(mock).sendFirst(); then(targetState.is("called"));
			one(mock).send(); when(targetState.is("called"));
		}});
		target.execute();
                // act
		target.execute();		
	}
}

GOOSを読んでて気になったので、JMockの state を練習していた。
対象オブジェクトの内部状態をアサーションしながら、隣人オブジェクトとのコラボレーションをアサーションしたいときに使うみたい。アサーションしているのは whenの箇所。

失敗レポートを読まないと、コードだけではうれしさは伝わってこないかもしれない。
使う人いるんかな。