如何使用静态内部类来模拟对象的实例化?

问题描述:

我有下面的方法,我需要单元测试。如何使用静态内部类来模拟对象的实例化?

如何在下面模拟创建LDUser对象?

public void isFeatureFlagOn(String featureFlagId, TransactionContext transContext, boolean defaultReturnState) 
    throws TAServiceException { 
     boolean returnState = defaultReturnState; 
     try { 
      LDUser ldUser = new LDUser.Builder(transContext.getAuthId()).build(); 
      returnState = ldClient.boolVariation(featureFlagId, ldUser, defaultReturnState); 
     } catch (Exception e) { 
      returnState = defaultReturnState; 
     } 

     if (!returnState) { 
      throw new TAServiceException("This service is not available", HttpStatus.NOT_FOUND); 
     } 
    } 
+0

是[我的文章](https://github.com/mockito/mockito/wiki/Mocking-Object-Creation)有什么用? –

这真的不可行,除非你使用PowerMock这样的东西。但是,您可能需要考虑注入LDUser构建器,以便在调用测试方法时可以嘲笑构建器。通过构建器模拟,你可以模拟它如何构建你想要的模拟LDUser实例。所以,你的测试方法看起来是这样的:

// ... 
when(mockLdUserBuilder.build()).thenReturn(mockLdUser); 
classUnderTest.methodUnderTest(mockLdUserBuilder); 
// ... assert/verify stuff 

您可以创建可用于注入嘲笑建设者一个package水平的方法。

public void isFeatureFlagOn(...) throws TAServiceException { 
    boolean returnState = defaultReturnState; 
    try { 
     getBuilder(transContext.getAuthId()).build(); 
     ... 
    } 
    ... 
} 
//package method 
Builder getBuilder(int authId) { 
    return new LDUser.Builder(authId); 
} 

然后在您的测试中,您可以重写此方法。

@Mock 
LDUser.Builder builder; 

@Test 
public void test1() { 
    MyClass myClass = new MyClass() { 
    @Override 
    Builder getBuilder(int authId) { 
     return builder; 
    } 
    } 
    myClass.isFeatureFlagOn(...); 
    ... 
}