当前位置: 首页 > 知识库问答 >
问题:

在JUnit Testing+Mockito中,sharedPreference.edit()提供NullPointerException

权黎昕
2023-03-14
{
    private HomeActivity homeActivity;
    private SessionManager sessionManager;
    private String result_time;

    @Mock
    Context context;

    @Mock
    SharedPreferences.Editor editor;

    @Mock
    SharedPreferences sharedPreferences;

    @Before
    public void Setup()
    {

         homeActivity = new HomeActivity();
         sessionManager = new SessionManager(context);
        when(context.getSharedPreferences(anyString(), anyInt()))
                .thenReturn(sharedPreferences);
        when(sharedPreferences.edit()).thenReturn(editor);
        when(editor.putString(anyString(), anyString())).thenReturn(editor);
    }

    @Test
    public void test_calculateTimeAgo()
    {
        when(sessionManager.getLastSyncDateTime()).thenReturn("13-07-2020 20:22");
        result_time = homeActivity.CalculateAgoTime();
        assertFalse(result_time.isEmpty());
    }
}
   public String CalculateAgoTime() {
        String finalTime = "";

        String syncTime = sessionManager.getLastSyncDateTime();

        SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm", Locale.getDefault());
        ParsePosition pos = new ParsePosition(0);
        long then = formatter.parse(syncTime, pos).getTime();
        long now = new Date().getTime();

        long seconds = (now - then) / 1000;
        long minutes = seconds / 60;
        long hours = minutes / 60;
        long days = hours / 24;

        String time = "";
        long num = 0;
        if (days > 0) {
            num = days;
            time = days + " " + context.getString(R.string.day);
        } else if (hours > 0) {
            num = hours;
            time = hours + " " + context.getString(R.string.hour);
        } else if (minutes >= 0) {
            num = minutes;
            time = minutes + " " + context.getString(R.string.minute);
        }
//      <For Seconds>
//      else {
//            num = seconds;
//            time = seconds + " second";
//      }
        if (num > 1) {
            time += context.getString(R.string.s);
        }
        finalTime = time + " " + context.getString(R.string.ago);

        sessionManager.setLastTimeAgo(finalTime);

        return finalTime;
    }
 public SessionManager(Context context) {
        this._context = context;
        pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
        editor = pref.edit();
    }

sharedpef的Getter和Setter:

public String getLastSyncDateTime() {
        return pref.getString(LAST_SYNC_SUCCESS_DATE_TIME, "- - - -");
    }  //getting the sync value  and time and saving in the sharedpref

    public void setLastSyncDateTime(String lastPulledDateTime) {
        editor.putString(LAST_SYNC_SUCCESS_DATE_TIME, lastPulledDateTime);
        editor.commit();
    }

共有1个答案

麹繁
2023-03-14

我不确定这一点。但是您错过了注入模拟注释变量的一行代码,这可能是由于出现了异常。

需要包含在@before方法中的代码:

initMocks(this);

 类似资料:
  • 我正在使用SpringRunner运行JUnit mockito测试用例,下面是类,我试图编写测试用例,但得到空对象 //Junit测试用例 但是下面的代码即使在模拟这个之后仍然返回空值,你能帮助如何模拟这个吗? 注意:只有Mockito需要使用无powermockito

  • 我有一个使用Spring依赖注入的Java应用程序。我想模拟一个bean,并验证它是否接收某些方法调用。 问题是Mockito不会在测试之间重置mock,因此我无法正确验证对它的方法调用。 我的测试单元: 单元测试类: 最后, 虽然我可以通过在测试之间手动重置模拟来解决这个问题,但我想知道是否有更干净/更习惯的方法。

  • 这个程序应该做什么, 我希望它显示一个空白屏幕,直到我在键盘上点击任何字符。但是它做的事情很奇怪。它显示我按的任何东西。它永远不会终止,直到我按下回车键。 据我所知,getchar()应该只读取一个字符。它不应该输出任何东西。 为什么它打印我输入的每个字符? 编辑: 为什么 getchar() 在读取一个字符后不停止,例如在这段代码中: 程序应在读取一个字符后打印完成。

  • 没有空白的GUI显示为“拥挤”。我如何提供空白而不需要明确地设置元件的位置或尺寸?………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………

  • 问题内容: 使OAuth提供程序以Java运行的最快/最简单方法是什么?具体来说,我需要授权第三方应用访问某些Web服务(我正在考虑使用OAuth进行令牌身份验证)。 我一直在寻找在新泽西州的OAuth扩展,但提到这里,它没有提供一个完整的服务供应商。 问题答案: 有一些Java库可用于OAuth。具体来说,我来看看这个。我自己没有使用过,但是有一个运行OAuth服务提供商的示例。 OAuth网站

  • 我试过这个: 我必须创建一个origin access标识和一个具有此标识的CloudFront发行版。我们可以在一个CloudFormation脚本中或使用Serverless(使用)来完成这两件事吗?