首页 > 解决方案 > InjectMocks 类的方法返回 Null

问题描述

使用 Mockito 运行 JUnit 测试用例时,我从下面manager.managerLogString的方法( ArticleManager@InjectMocks类的方法)返回空值。

TestingString = manager.managerLogString();

同时,我能够UserInput为下面的 mockito 验证方法获得正确的 " " 值。

verify(user).setMyuserString("UserInput");

如下捕获的完整代码,如果您能提供建议,不胜感激。

package com;

public class User {
  private String userString;

  public User() {}

  public void setMyuserString(String userString) {
     this.userString = userString;
  }

  public String logMyUserString() {
      return this.userString;
  }
}

文章经理:

package com;

import javax.inject.Inject;

public class ArticleManager{

  @Inject
  private User user;

  public String managerLogString() {
      return this.user.logMyUserString();
  }
}

测试:

package com;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.Captor;
import org.mockito.InjectMocks;  
import org.mockito.Mock;


@RunWith(MockitoJUnitRunner.class)
public class MockExample {
@Mock User user;
@InjectMocks private ArticleManager manager; 
private String TestingString;

@Test
public void test() {
    user.setMyuserString("UserInput");
            // verify this mock class return correct value
    verify(user).setMyuserString("UserInput");

            // why this manager.managerLogString return null value ??
    TestingString = manager.managerLogString();
    System.out.println(TestingString);

    assertEquals("UserInput", TestingString);
}
}

有了这里的建议,代码现在运行良好。更新后的代码如下所示。

更新代码:

@Test
public void test() {
    when(user.logMyUserString()).thenReturn("UserInput");

    TestingString = manager.managerLogString();
    verify(user).logMyUserString();

    System.out.println(TestingString);

    assertEquals("UserInput", TestingString);
}

标签: javamockito

解决方案


这里:

@Mock
User user;

然后你去:

user.setMyuserString("UserInput");
// verify this mock class return correct value
verify(user).setMyuserString("UserInput");

这根本没有任何意义。你在嘲笑那个班级。这意味着您创建了一个对象,上面写着“我是用户”,但实际上并非如此。换句话说:您唯一想要/需要做的就是告诉您的模拟在logMyUserString()调用时返回预期值!

如:

when(user.logMyUserString()).thenReturn("User Input");

现在,当您正确使用 @InjectMocks 调用时logMyUserString()模拟将返回您告诉它返回的字符串。但是您想在这里查看以了解注入是多么容易出错。

使用 setter 方法没有意义,因为该 setter 是“人造的”,它没有设置任何东西!

除此之外:为什么你的生产代码类中有@Inject 注释?如果你认为你需要它们来模拟,错了,不,你不需要。

最后:我认为你应该回去看看一个好的 Mockito教程。你真正的问题是你对自己在做什么缺乏了解。


推荐阅读