簡體   English   中英

如何使用 Mockito 模擬內部類實例

[英]How to mock Inner class instance using Mockito

@ConfigurationProperties(prefix= 'app')
@Getter @Setter
public class AppConfig{
    private ExternalService externalService=new ExternalService();

    @Getter @Setter
    public static class ExternalService{
    private String url;
    private String authToken;
    }
}

我正在使用 AppConfig 的服務。

@Service
@AllArgsConstructor
    public class ExternalService{
    private final AppConfig appConfig;

    public boolean isAuthorize(String token){
        String authUrl=appConfig.getExternalService().getUrl();
        boolean isAuthorize= //External Apis call
        return isAuthorize;
    }
}

ExternalService 的測試類

@ExtendWith(MockitoExtension.class)
class ExternalTestService{

    @Mock
    private AppConfig AppConfig;
    
    @Mock
    private AppConfig.ExternalService externalSeriveConfig;

    @InjectMocks
    private ExternalService externalService;

    @Test
    public void shouldAuthorize(){
    //Null Pointer exception for AppConfig.getExternalService() 
    Mockito.when(AppConfig.getExternalService().getUrl()).thenReturn("123456");
    Assertions.assertEquals(externalService.isAuthorize(),true);
}

如果我在 shouldAuthorize 中模擬 GradingProperties.CentralServiceConfig 那么它工作正常但是在 ExternalService(String authUrl=appConfig.getExternalService().getUrl();) 的 Assertions.assertEquals 時得到 NullPointerException 像

@Test
public void shouldAuthorize(){
    AppConfig.ExternalService externalMock=Mockito.mock(AppConfig.ExternalService.class);
    
    Mockito.when(externalMock.getUrl()).thenReturn("123456");
    Assertions.assertEquals(externalService.isAuthorize(),true);
}

如何模擬並使此代碼可運行

當您有鏈式方法調用時,您需要確保鏈式調用的每個部分都返回非空結果。

Mockito.when(AppConfig.getExternalService().getUrl()).thenReturn("123456");

您尚未對AppConfig任何調用,因此AppConfig.getExternalService()返回 null。

你需要:

Mockito.when(AppConfig.getExternalService()).thenReturn(externalSeriveConfig);
Mockito.when(AppConfig.getExternalService().getUrl()).thenReturn("123456");

或者,甚至更好:

Mockito.when(AppConfig.getExternalService()).thenReturn(externalSeriveConfig);
Mockito.when(externalSeriveConfig.getUrl()).thenReturn("123456");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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