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

时间:2014-10-29 12:27:20

标签: java unit-testing junit mockito powermock

如何模拟返回模拟对象的方法。

我有一个方法,它返回一个模拟对象,该对象从Object转换为SomeClass,然后调用SomeClass上的方法。

问题是方法getBean("SomeClass")返回Object而不是SomeClass如此嘲笑

when(mockApplicationContext.getBean("SomeClass")).thenReturn(mockSomeClass);

dosent工作,因为返回类型错误并且嘲笑

when(mockApplicationContext.getBean("SomeClass")).thenReturn(mockObject);

剂量工作,因为SomeClass剂量存在,并且我无法模拟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");

    // ...
}

2 个答案:

答案 0 :(得分:2)

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

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

    // ...
}

答案 1 :(得分:0)

以下是执行所需操作的简单示例 - 您需要在设置期间指定模拟类的行为:

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"