Java 如何模拟返回已强制转换的模拟对象的方法

Java 如何模拟返回已强制转换的模拟对象的方法,java,unit-testing,junit,mockito,powermock,Java,Unit Testing,Junit,Mockito,Powermock,如何模拟返回已强制转换的模拟对象的方法。 public void anyMethod() { // code omitted ( (SomeClass) getApplicationContext().getBean("SomeClass") ).someMethod(anArgument); // ... } @Test public void testAnyMethod() { // ... SomeClass moc

如何模拟返回已强制转换的模拟对象的方法。

    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");

    // ...
}
我有一个方法,它返回一个模拟对象,该对象从
对象
转换为
SomeClass
,然后在
SomeClass
上调用一个方法

问题在于方法
getBean(“SomeClass”)
返回一个
对象
,而不是
SomeClass
,因此模拟

when(mockApplicationContext.getBean(“SomeClass”)。然后返回(mockSomeClass)

dosent的工作方式是返回类型错误和模仿

when(mockApplicationContext.getBean(“SomeClass”)。然后返回(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

    ( (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");

    // ...
}

下面是一个简单的示例,说明如何做您想做的事情-您需要在设置过程中指定模拟类的行为:

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"
ApplicationContext ctx=mock(ApplicationContext.class);
List mockList=mock(List.class);
when(ctx.getBean(“XYZ”)),然后return(mockList);
当(mockList.get(0))。然后返回(“ABC”);//设置行为!
//ctx.getBean(“XYZ”).get(0);//无法在此调用列表方法
//投进一个
System.out.println(((List)ctx.getBean(“XYZ”)).get(0));//打印“ABC”
// .. 或者加入一个新的参考
List=(List)ctx.getBean(“XYZ”);
System.out.println(list.get(0));//还打印“ABC”

如果您稍微更改方法实现以使用类型安全方法:

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);

    // ...
}

如果在(mockSomeClass.someMethod(anaargument))时出现
错误,是否存在代码错误(至少在代码段中是这样)。然后返回(someResult)而且代码似乎混合了PowerMockito和MockitoAPI。我不认为PowerMockito在这个测试中有用。无论如何,我认为从
applicationContext.getBean()
返回
SomeClass
(无论是模拟还是非模拟)没有任何问题,因为SomeClass继承了
对象
,我强烈建议您不要模拟您不拥有的类型@由于
getApplicationContext()
不可见,因此需要Brice-PowerMockito。“…不是你不拥有的模拟类型!”那么你将如何测试它?