2017-05-25 49 views
3

我正在使用InjectMocksSpy註釋來注入原型bean。如何在Mockito中注入原型bean

然而,注入Bean的行爲與單身bean相似。有沒有辦法在Mockito中注入一個原型範圍的bean?

我使用SpringJUnit4ClassRunner運行JUnit,並且使用MockitoAnnotations.initMocks(this)來初始化mock。

+0

如果你使用@Spy,你的原型bean的哪個實例會被窺視,如果有多個?你聲明瞭一個變量,但希望它作爲幾個變量,我是否明白這一點? –

+0

我使用間諜作爲依賴是私有變量。是的,我聲明瞭1個變量,並且我期待Mockito在每次引用時都注入bean的新實例。 –

+0

沒有辦法做到這一點,我知道,當然期望手動。我懷疑這是在一個典型的mockito環境中的真正需求,在那裏你想調用'do ... when ...'或'verify'作爲間諜,如果'@ Spy'變量只是一些一種模板,而不是實際的間諜。 –

回答

2

這是因爲Mockito在編譯時創建了注入的對象。 如果你想要一個類似原型的行爲,你需要切換到使用答案。

例如,假設您的Spring應用程序有一個bean原型稱爲Foo和你的代碼做這樣的事情多次:

ctx.getBean("Foo"); 

因爲foo是一個原型,每一次的getBean()被調用時, Foo的新實例由Spring返回。

現在,在您的Mockito測試中,您嘲笑ctx以欺騙getBean()並返回您自己的預配置Foo實例。

,如果你設置你的測試像下面,不管有多少次你的代碼調用ctx.getBean(),富的同一實例將返回:

Foo foo = new Foo(); 
decorateFoo(foo); 
when(ctx.getBean("Foo")).thenReturn(foo); 

這是你如何實現原型在你的測試中的行爲:

when(ctx.getBean("Foo")).then(new FooAnswer()); 

private class FooAnswer implements Answer<Foo> { 
    @Override 
    public Foo answer(InvocationOnMock invocationOnMock) throws Throwable { 
       return new Foo(); // and configure as needed 
    } 
} 
+0

我不從上下文獲取bean。我使用了Autowire註釋。 –