かまたま日記3

プログラミングメイン、たまに日常

JMockでテストをする

現在業務でJMockを使ったテストを行おうとしているため、JMockの勉強中です。

最初は以下のページ
 jMockを使ってみる
を参考にテストコードを書いていたのですが
拡張していくうちにエラーが出てきてしまい嵌ってしまったためその点をメモ

  • 引数の比較

JMockで作ったオブジェクトの引数は同値性で比較されるため
equalsメソッドを用意する必要があるみたいです。

equalsメソッドは以下を参考に
org.apache.commons.lang.builder.EqualsBuilder
メソッドを利用しました。
 jMockの簡単なまとめ - A Memorandum

      • -

Mock作成対象のインターフェース

public interface External {
	String someExternal(SampleEntity entity);
}

テスト実施対象のクラス

public class Sample {
	  private External external;

	  public void some(SampleEntity arg) {
	    System.out.println("some start");
	    arg1 =  "test1";
	    System.out.println(external.someExternal(new SampleEntity(arg1, arg2)));
	    System.out.println("some end");
		  }

	  public void setExternal(External external) {
	    this.external = external;
	  }
}

引数のエンティティクラス

import org.apache.commons.lang.builder.EqualsBuilder;

public class SampleEntity {

	private String arg1;
	private String arg2;

	public SampleEntity(String arg1, String arg2) {
		super();
		this.arg1 = arg1;
		this.arg2 = arg2;
	}

	public String getArg1() {
		return arg1;
	}

	public void setArg1(String arg1) {
		this.arg1 = arg1;
	}

	public String getArg2() {
		return arg2;
	}

	public void setArg2(String arg2) {
		this.arg2 = arg2;
	}

	// equalsメソッドがないとテスト失敗
	@Override
	public boolean equals(Object obj) {
		return EqualsBuilder.reflectionEquals(this, obj);
	}
}

テストメソッド

// import略

@RunWith(JMock.class)
public class SampleTest {

	  private Mockery context = new JUnit4Mockery();
	  private External external;
	  private Sample instance;

	  @Before
	  public void setUp() throws Exception {
	    external = context.mock(External.class);
	    instance = new Sample();
	    instance.setExternal(external);
	  }

	  @Test
	  public void testSome() {
	    context.checking(new Expectations() {{
	      SampleEntity a = new SampleEntity("test1", "i");
	      one(external).someExternal(a);
	      will(returnValue("return1"));
	    }});

	    instance.some("a", "i");
	  }
}