2016-02-26 29 views
0
class ArgumentClass{ 
    int var; 
} 

class ClassMocked{ 
    int aMothod(ArgumentClass argumentClass){ 
     return anInt; 
    } 
} 

class MyTest{ 
    Mock and Stub here 
} 

在MyTest中,我想存根aMothod,使其返回基於ArgumentClass.var的值。我必須一氣呵成。 換句話說,我有一個測試用例,其中一個moehod被應用程序代碼調用了三次,並且基於一個參數對象中的變量,我需要不同的返回值。我需要相應地存根。請讓我知道是否有辦法。基於參數的存根方法

+0

您應該提供一些關於您想要的測試和模擬方法的預期結果的更多信息。例如,你可以調用'when(mock.aMethod(any())),thenReturn(1,2,3)',但我不知道你的情況是否足夠了解這是否是你需要的。 –

回答

0

如果我理解正確,可以用mockito以兩種不同的方式來完成。如果聲明ClassMocked作爲假的,你應該可以這樣說:

when(mock.aMothod(eq(specificArgument))).thenReturn(1); 
when(mock.aMothod(eq(anotherSpecificArgument))).thenReturn(2); 

如果你想這樣做,無論參數傳遞希望根據該方法,你可以的調用次數返回值說:

when(mock.aMothod(any())).thenReturn(1, 2); 

這是說,當aMothod,而不管傳遞的參數調用(任何()),它會在第一次調用1和所謂第二次時,它會返回2.

+0

第一種解決方案取決於'ArgumentClass'具有重寫的equals方法。另一個解決方案是簡單地爲它實現一個自定義的「匹配器」。 –

0

雖然你回來可以按照正確的順序讓你的模擬返回值karruma's answer,您還可以使用Answer計算嘲笑值:

when(mock.aMothod(any())).thenAnswer(new Answer<Integer>() { 
    @Override public Integer answer(InvocationOnMock invocation) { 
    ArgumentClass argument = invocation.getArguments()[0]; 
    return calculationBasedOn(argument); 
    } 
}); 

或者在Java中8的Mockito 2β(未經測試,可能需要裝箱/拆箱管型):

when(mock.aMothod(any())).thenAnswer(invocation -> 
    calculatebasedOn(invocation.getArgumentAt(0, ArgumentClass.class))); 

雖然我有頂級示例中的匿名內部類,當然,您可以創建一個命名的Answer子類,並在整個應用程序中重用它。