如何模拟一个返回一个模拟对象的方法

如何模拟一个返回一个模拟对象的方法

问题描述:

如何模拟一个方法,该方法返回一个被施放的模拟对象。如何模拟一个返回一个模拟对象的方法

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

问题是getBean("SomeClass")返回该方法的Object,而不是SomeClass如此嘲讽

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

dosent工作作为返回类型是错误的,嘲笑

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

    // ... 
} 
+0

难道你没有代码错误吗(至少在代码片段中),应该是'when(mockSomeClass.someMethod(anArgument))。thenReturn(someResult);' – Brice 2014-10-29 13:53:17

+0

另外它似乎代码混合PowerMockito和Mockito API。我不认为PowerMockito在这个测试中很有用。 – Brice 2014-10-29 13:55:33

+0

无论如何,我没有看到任何从'applicationContext.getBean()'返回'SomeClass'的问题(无论它是否是模拟的),因为SomeClass继承了'Object' – Brice 2014-10-29 14:03:33

如果你改变你的方法实现小幅使用类型安全的方法:

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"