java - 模拟类将 null 分配给 @NonNull 字段(Android)

标签 java android unit-testing mockito non-nullable

我使用 Android SDK 和 junit4 + Mockito 进行单元测试。假设我的应用程序中有一个这样的类:

public class Container{

  @NonNull private Set<String> values = new HashSet<>();

  public void addValue(String value) {
    values.add(value);
  }

  @NonNull
  public Set<String> getValues() {
    return values;
  }
}

我还使用 Mockito 进行了单元测试,如下所示:

public class ContainerTest {

  private Container container;

  @Before
  public void before() {
    container = mock(Container.class);
  }

  @Test
  public void shouldAddValue() {
    container.add("test_value");
    assertTrue(container.getValues.contains("test_value"));
  }

}

该测试实际上在“container.add("test_value");”行上失败了因为 mock(Container.class) 创建了一个类,其中 values 字段实际上设置为 null,因此 values.add(value) 中Strong>addValue() 方法抛出 NPE。我可以在 addValue() 中添加 null 检查来解决此问题,但这似乎很荒谬,因为值已经声明为非 null。

有没有办法让 Mockito 尊重 @NonNull 注释并正确初始化字段?

最佳答案

我认为您没有以正确的方式使用 Mockito,因为您必须定义 Mockito 行为。

例如,你应该有这样的东西:

@Test
public void shouldAddValue() {
    Set<String> mySet = new HashSet<String>();
    mySet.put("test_value");

    // Mock container getValues() method to return mySet
    when(container.getValues()).thenReturn(mySet); // do import static for Mockito.when

    assertTrue(container.getValues().contains("test_value"));
}

当您模拟响应时,Mockito 工作得很好,但您想要的是让 Mockito 为您初始化类,这显然不是 Mockito 的目标。

因此,如果你想测试你的 Container 对象,那么你不必模拟 Container 本身,你可以有这样的东西:

public class ContainerTest {

    private Container container;

    @Before
    public void before() {
        container = new Container(); // Initialize container
    }

    @Test
    public void shouldAddValue() {
        container.addValue("test_value");
        assertTrue(container.getValues().contains("test_value"));
    }

}

关于java - 模拟类将 null 分配给 @NonNull 字段(Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33617118/

相关文章:

Java - 带有列表的泛型

java - 如何在 tomcat 6 上启用 NIO/atmosphere

带有imageview的可点击布局的android选择器

python - 在 Python 中从单元测试中输出数据

javascript - Jasmine 测试在值为 null 时调用函数

java - 如何修复底部按钮上的软键盘重叠?

java - 如何使用 Rest-client API 将附件添加到现有 JIRA 问题

java - android同步隐藏状态栏

Android Volley - BasicNetwork.performRequest : Unexpected response code 400

python - 如何使用子进程有效地测试基于 readline 的 Python 程序?