InjectMocks类的方法返回Null

时间:2019-01-30 09:22:25

标签: java mockito

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

TestingString = manager.managerLogString();

同时,我可以为下面的模仿验证方法获取正确的“ UserInput”值。

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

2 个答案:

答案 0 :(得分:1)

这里:

@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()时, mock 将返回您告诉它返回的字符串。但是您想看看here来了解注入出错的可能性。

使用setter方法没有意义,因为该setter是“人工的”,它什么也没设置!

除此之外:为什么在生产代码类中有@Inject批注?如果您认为需要它们来进行模仿,那么,不,您不需要。

最后:我认为您应该回过头来看看一个好的Mockito tutorial。真正的问题是您对自己的工作缺乏了解。

答案 1 :(得分:0)

您没有创建ArticleManager

的实例

尝试这种方式

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