在静态方法Junit中获取空指针



我有以下服务

public UserActivityLog save(UserActivityLog userActivityLog){
LOGGER.debug("User activity save called.");
userActivityLog.setCreatedByUser(User.getUser().getUserId());
userActivityLog.setCreationTime(new Date());
return activityLogRepository.save(userActivityLog); 
}

我已经在 Junit 之后写了测试,但为用户获取空指针

@RunWith(MockitoJUnitRunner.class)
public class ActivityHistoryServiceTest {
@InjectMocks
private ActivityHistoryService activityHistoryService;
@Mock
private ActivityLogRepository activityLogRepository;
@Test
public void testSave() {
UserActivityLog userActivityLog = new UserActivityLog();
/* Called some setter methods to set value here*/
UserProfile profile = new UserProfile();
Mockito.when(User.getUser()).thenReturn(profile);
Assert.assertNotNull(activityLogRepository.save(userActivityLog));  
}
}

用户类就像

public class User {
private User(){}
public static UserProfile getUser(){
/*some logic*/
return userProfile;
}

}

请帮忙。提前谢谢。

静态方法在有用时很有用。使用它们作为单例的替代品不是一个很好的做法。而不是你拥有的代码可能看起来像这样:

public class MyClass {
private final Logger logger;
private final UserProvider userProvider;
private final DateProvider dateProvider;
/** Constructor that sets all attributes */
public MyClass(...) {...}
public UserActivityLog save(UserActivityLog userActivityLog){
LOGGER.debug("User activity save called.");
userActivityLog.setCreatedByUser(userProvider.get().getUserId());
userActivityLog.setCreationTime(dateProvider.get());
return activityLogRepository.save(userActivityLog); 
}
}

Provider类非常简单。他们只有一个返回所需类型的实例的get()方法:

public class DateProvider {
public Date get() {
return new Date();
}
}
public class UserProvider {
public User get() {
...
}
}

通过此设置,您可以轻松模拟依赖项

你需要 PowerMock 来模拟静态方法。 指: https://blog.codecentric.de/en/2016/03/junit-testing-using-mockito-powermock/

最新更新