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

Java 在静态方法Junit中获取空指针,java,spring,unit-testing,junit4,Java,Spring,Unit Testing,Junit4,我有以下服务 public UserActivityLog save(UserActivityLog userActivityLog){ LOGGER.debug("User activity save called."); userActivityLog.setCreatedByUser(User.getUser().getUserId()); userActivityLog.setCreationTime(new Date()); return activit

我有以下服务

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来模拟静态方法。 参考:

不能用Mockito模拟静态方法。您还可以为此使用PowerMock。