[英]Mockito doReturn doesn't return mocked Interface in MVC with singleton
我有A.class要測試:
private void register(...) {
...
abcInterface abc = ControllerFactory.getABCController().getABCInterface(); //returns real interface instead of mock
Call<SOMECLASS> call = abc.subscribe(...);
Response<SOMECLASS> response = call.execute();
...
}
ControllerFactory.class是一個類,其中實例化了AbcController
單個實例。
我必須模擬abcInterface
來模擬然后請求和響應,我寫了以下內容:
@RunWith(MockitoJUnitRunner.Silent.class)
public class ATest {
@Mock
AbcInterface AbcInterface;
@Mock
Call<SOMECLASS> request;
@Mock
ControllerFactory controllerFactory;
@Mock
AbcController abcControllerMock;
@Before
public void setup() {
ControllerFactory.createAbcController(); //always single instance is instantiated
}
@Test
public void registerTest() {
Mockito.doReturn(dmsControllerMock).when(controllerFactory).getDmsController();
Mockito.doReturn(abcInterface).when(abcControllerMock).getAbcInterface();
SOMECLASS response = ...
Response<SOMECLASS> response = Response.success(200, response);
Mockito.doReturn(request).when(abcInterface).subscribe(Mockito.any());
Mockito.when(request.execute()).thenReturn(response);
A a = new A(...);
a.register(...);
}
}
問題是ControllerFactory.getABCController().getABCInterface();
返回真實接口而不是模擬。
它看起來像你忘了嘲笑getABCController
方法,它應該返回你的abcControllerMock
,而是getABCController
回報的“真實”的實例AbcController
然后將返回一個“真實”的實例AbcInterface
。
因此,要么模擬getABCController
要么為A
創建一個接受 AbcController 的構造函數,然后在創建A
的實例時將模擬傳遞到該構造函數中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.