短答案
在您的情况下该如何做:
int argument = 5; // example with int but could be another type
Mockito.when(mockMyAgent.otherMethod(Mockito.anyInt()).thenReturn(requiredReturnArg(argument));
长答案
实际上,至少在Java 8中,您可能想做的事情是可能的。也许您没有得到其他人的回答,因为我使用的Java 8允许这样做,而这个问题是在Java 8发布之前的(允许传递函数) ,不仅是其他函数的值)。
让我们模拟对数据库查询的调用。 此查询返回具有FreeRoms = X和StarNumber = Y的HotelTable的所有行。我在测试过程中期望的是,该查询将返回不同酒店的列表:每个返回的酒店都具有相同的值X和Y,而其他值则由我根据自己的需要决定。 以下示例很简单,但是您当然可以使其更复杂。
因此,我创建了一个函数,该函数将返回不同的结果,但是所有函数都具有FreeRoms = X和StarNumber =Y。
static List simulateQueryOnHotels(int availableRoomNumber, int starNumber) {
ArrayList HotelArrayList = new ArrayList<>();
HotelArrayList.add(new Hotel(availableRoomNumber, starNumber, Rome, 1, 1));
HotelArrayList.add(new Hotel(availableRoomNumber, starNumber, Krakow, 7, 15));
HotelArrayList.add(new Hotel(availableRoomNumber, starNumber, Madrid, 1, 1));
HotelArrayList.add(new Hotel(availableRoomNumber, starNumber, Athens, 4, 1));
return HotelArrayList;
}
也许Spy更好(请尝试),但是我在一个模拟的类上做到了。 这是我的操作方法(注意anyInt()值):
//somewhere at the beginning of your file with tests...
@Mock
private DatabaseManager mockedDatabaseManager;
//in the same file, somewhere in a test...
int availableRoomNumber = 3;
int starNumber = 4;
// in this way, the mocked queryOnHotels will return a different result according to the passed parameters
when(mockedDatabaseManager.queryOnHotels(anyInt(), anyInt())).thenReturn(simulateQueryOnHotels(availableRoomNumber, starNumber));