[英]How to mock a method that returns a mock object which is cast
如何模擬返回返回的模擬對象的方法。
我有一個方法,該方法返回模擬對象,該Object
從Object
轉換為SomeClass
然后在SomeClass
上調用方法。
問題是方法getBean("SomeClass")
返回一個Object
而不是SomeClass
所以嘲笑
when(mockApplicationContext.getBean("SomeClass")).thenReturn(mockSomeClass);
由於返回類型錯誤且嘲笑,因此無法正常工作
when(mockApplicationContext.getBean("SomeClass")).thenReturn(mockObject);
dosent工作作為呼吁方法SomeClass
dosent存在,我不能假裝SomeClass
。
怎么可以嘲笑呢?
測試方法。
public void anyMethod() {
// code omitted
( (SomeClass) getApplicationContext().getBean("SomeClass") ).someMethod(anArgument);
// ...
}
測試方法。
@Test
public void testAnyMethod() {
// ...
SomeClass mockSomeClass = mock(SomeClass.class);
when(mockSomeClass.someMethod(anArgument)).thenReturn(someResult);
ApplicationContext mockApplicationContext = mock(ApplicationContext.class);
when(mockApplicationContext.getBean("SomeClass")).thenReturn(mockSomeClass);
PowerMockito.doReturn(mockApplicationContext).when(GetContext.class, "getApplicationContext");
// ...
}
如果您稍微改變方法的實現以使用類型安全的方法:
public void anyMethod() {
// code omitted
getApplicationContext().getBean("SomeClass", SomeClass.class).someMethod(anArgument);
// ...
}
那么您的測試班級只更改了一點:
@Test
public void testAnyMethod() {
// ...
SomeClass mockSomeClass = mock(SomeClass.class);
when(mockSomeClass).someMethod(anArgument).thenReturn(someResult);
// The problem is that .getBean("SomeClass") returns Object.class which is then cast
// to SomeClass in anyMethod. If I return an Object then someMethod(anArgument) dosent exist
ApplicationContext mockApplicationContext = mock(ApplicationContext.class);
when(mockApplicationContext.getBean("SomeClass", SomeClass.class)).thenReturn(mockSomeClass);
// ...
}
這是做您想做的一個簡單示例-您需要在設置過程中指定模擬類的行為:
ApplicationContext ctx = mock(ApplicationContext.class);
List<String> mockList = mock(List.class);
when(ctx.getBean("XYZ")).thenReturn(mockList);
when(mockList.get(0)).thenReturn("ABC"); // Setting up the behaviour!
// ctx.getBean("XYZ").get(0); // can't call List methods here
// Cast and call in one
System.out.println(((List<String>) ctx.getBean("XYZ")).get(0)); // Prints "ABC"
// .. or cast into a new reference
List<String> list = (List<String>) ctx.getBean("XYZ");
System.out.println(list.get(0)); // Also prints "ABC"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.