如何模拟一个返回模拟对象的方法
我有一个方法,它返回一个模拟对象,该对象从Object
转换为SomeClass
,然后调用SomeClass
上的一个方法。
问题是方法getBean("SomeClass")
返回Object
而不是SomeClass
,因此模拟
when(mockApplicationContext.getBean("SomeClass")).thenReturn(mockSomeClass);
由于返回类型错误而停止工作并嘲笑
when(mockApplicationContext.getBean("SomeClass")).thenReturn(mockObject);
docent的工作方式与CCD_ 9上调用的方法一样docent存在,我无法模拟CCD_。
这怎么能被嘲笑呢?
测试方法
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"