2014-10-29 104 views
0

如何模擬一個方法,該方法返回一個被施放的模擬對象。如何模擬一個返回一個模擬對象的方法

我有一個方法,它將一個模擬對象從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

回答

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

    // ... 
} 
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" 
相關問題