简短的回答
在你的情况下怎么做:
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 发布之前(允许传递函数) ,不仅是其他函数的值)。
让我们模拟对数据库查询的调用。此查询返回 HotelTable 中所有 FreeRoms = X 和 StarNumber = Y 的行。我在测试期间期望的是,此查询将返回一个不同酒店的列表:每个返回的酒店具有相同的值 X 和 Y,而其他值,我将根据我的需要决定它们。下面的例子很简单,当然你也可以让它变得更复杂。
所以我创建了一个函数,它会返回不同的结果,但它们都有 FreeRoms = X 和 StarNumber = Y。
static List<Hotel> simulateQueryOnHotels(int availableRoomNumber, int starNumber) {
ArrayList<Hotel> 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));