jmockでunexpected invocationエラー

3346 ワード

リモートサービスインタフェース
 
public interface RemoteService {

    public BaseResult findMemberById(Query query);

    public String addMethod();
}

戻り値カプセル化オブジェクト
 
public class BaseResult {
	
	private String name;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

サービスクラス
 
public class RealService {

    private RemoteService remoteService;

    public void doExecute(String memberId) {
    	BaseResult apple = null;
    	Query query = new Query(memberId);
    	apple = getRemoteService().findMemberById(query);
        System.out.println(apple);
    }

	public RemoteService getRemoteService() {
		return remoteService;
	}

	public void setRemoteService(RemoteService remoteService) {
		this.remoteService = remoteService;
	}

}

jmockシミュレーションテスト
 
public class RealServiceTest extends TestCase {

    private RealService service = new RealService();

    @Test
    public void testDoExecute() {

        Mockery context = new Mockery();
        final RemoteService remoteService = context.mock(RemoteService.class);
        final BaseResult result = new BaseResult();
        final Query query = new Query("test");
        result.setName("apple");
        
        context.checking(new Expectations() {

            {
                oneOf(remoteService).findMemberById(query);
                will(returnValue(result));
            }
        });

        service.setRemoteService(remoteService);
        service.doExecute("test120");
        context.assertIsSatisfied();
    }

}

エラーの実行:
 
と書く
unexpected invocation: morganService.findMemberById()
expectations:
expected once, never invoked: morganService.findMemberById()
parameter 0 did not match: , because was ; returns
what happened before this: nothing!
…………
…………
観察エラー:
com.jmockTest.Query@14a8cd1
com.jmockTest.Query@e0b6f5
2つのQueryオブジェクトの参照があり、1つの問題を説明します.Queryというクラスはnewに2回、RealServiceTestというクラスではnewに1回、RealServiceでもnewに1回があります.
jmockが使用するエージェントメカニズムは、テストクラスを実行するときにパラメータ値が一致せず、エラーが発生します.
 
ソリューション:http://www.jmock.org/cheat-sheet.html
 
 
 :
To define looser constraints, specify all arguments as matchers within with clauses:

allowing (calculator).add(with(any(int.class)), with(any(int.class)));
 
 
使用:oneOf(remoteService).findMemberById(with(any(Query.class))); この文は問題を解決する.