簡體   English   中英

如何使用靜態內部類模擬對象的實例化?

[英]How can I mock instantiation of an object using static inner class?

我有以下方法需要進行單元測試。

如何模擬下面的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);
        }
    }

除非您為此使用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(...);
  ...
}

暫無
暫無

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

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