2015-05-28 47 views
0

我想用對的Mockito有一個模擬對象兩個接口以下面的方式來創建一個模擬春SPEL:的嘲諷多個接口

Mockito.mock(InterfaceA.class, Mockito.withSettings().extraInterfaces(InterfaceB.class)); 

我使用XML的Spring配置,我想找到一個用SPel來聲明這個模擬的方法。 我試過以下,但沒有成功:

<bean id="myMockObject" class="org.mockito.Mockito" factory-method="mock"> 
     <constructor-arg value="my.package.InterfaceA"/> 
     <constructor-arg value="#{T(org.mockito.Mockito).withSettings().extraInterfaces(T(my.package.InterfaceB))}"/> 
</bean> 

看起來像春天模擬不能自動裝配到類型InterfaceB領域。有人可以建議我錯了嗎?

回答

1

這對我很好,你意識到你必須投入模擬訪問額外的接口方法,不是嗎?

@ContextConfiguration 
@RunWith(SpringJUnit4ClassRunner.class) 
public class Foo { 

    @Autowired 
    private Bar barr; 

    @Test 
    public void foo() { 
     Bar bar = mock(Bar.class, Mockito.withSettings().extraInterfaces(Baz.class)); 
     ((Baz) bar).baz(); 
     ((Baz) this.barr).baz(); 
    } 

    public interface Bar { 

     void bar(); 
    } 

    public interface Baz { 
     String baz(); 
    } 

} 

<bean id="bar" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="foo.Foo$Bar"/> 
    <constructor-arg value="#{T(org.mockito.Mockito).withSettings().extraInterfaces(T(foo.Foo$Baz))}"/> 
</bean> 

從的javadoc ...

* <p> 
* This mysterious feature should be used very occasionally. 
* The object under test should know exactly its collaborators & dependencies. 
* If you happen to use it often than please make sure you are really producing simple, clean & readable code. 

... 

* //now, the mock implements extra interfaces, so following casting is possible: 

... 

編輯

我剛剛更新了我的測試,我可以通過第二接口OK注入豆...

@Autowired 
private Baz baz; 

@Test 
public void foo() { 
    when(this.baz.baz()).thenReturn("foo"); 
    System.out.println(this.baz.baz()); 
} 
+0

感謝您的回答。是的,我明白了,但我不明白爲什麼Spring不能自動將以這種方式創建的bean導入到InterfaceB類型的字段中。我將編輯我的問題以突出主要問題。 – androberz

+0

仍然適用於我;請參閱編輯。 –

+0

謝謝,會嘗試在我的代碼中找到問題。 – androberz