簡體   English   中英

Mockito doReturn 不使用單例返回 MVC 中的模擬接口

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM