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

时间:2017-10-19 03:55:18

标签: java unit-testing mockito powermock

我有以下方法需要进行单元测试。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可以创建一个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(...);
  ...
}