![](/img/trans.png)
[英]How can I access static inner class method using object of outer non static class?
[英]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.