我有以下方法需要进行单元测试。
如何模拟下面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 :(得分: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(...);
...
}