【问题标题】:Getting null pointer in static method Junit在静态方法 Junit 中获取空指针
【发布时间】:2017-07-11 07:07:29
【问题描述】:

我有以下服务

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;
}

}

请为此提供帮助。提前致谢。

【问题讨论】:

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

标签: java spring unit-testing junit4


【解决方案1】:

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

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() {
        ...
    }
}

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多