Java 莫基托·多雷图恩没有';在MVC中使用singleton返回模拟接口

Java 莫基托·多雷图恩没有';在MVC中使用singleton返回模拟接口,java,mockito,Java,Mockito,我有A.class要测试: private void register(...) { ... abcInterface abc = ControllerFactory.getABCController().getABCInterface(); //returns real interface instead of mock Call<SOMECLAS

我有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.getABCController().getABCInterface()
返回真实的接口而不是模拟。

看起来您忘记模拟
getABCController
方法,该方法应返回
AbcController模拟
,但
getABCController
返回
AbcController
的“真实”实例,然后返回“真实”实例
AbcInterface
的实例

因此,要么模拟
getABCController
,要么为
a
创建一个接受AbcController的构造函数,然后在创建
a
的实例时将模拟传递到该构造函数中;但它在Mockito.doReturn(dmsideface).when(dmsControllerMock.getdmsideface())上抛出UnfinishedStubbingException;
@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(...);
    }
}