如何使用静态内部类来模拟对象的实例化?
问题描述:
我有下面的方法,我需要单元测试。如何使用静态内部类来模拟对象的实例化?
如何在下面模拟创建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(...);
...
}
是[我的文章](https://github.com/mockito/mockito/wiki/Mocking-Object-Creation)有什么用? –