【问题标题】:Mocking a class assigns nulls to @NonNull fields(Android)模拟一个类将空值分配给@NonNull 字段(Android)
【发布时间】:2015-11-09 19:52:23
【问题描述】:

我正在使用 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) 在 addValue() 方法抛出 NPE。我可以在 addValue() 中添加一个空检查来解决这个问题,但这似乎很荒谬,因为值已经被声明为非空。

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

【问题讨论】:

    标签: java android unit-testing mockito non-nullable


    【解决方案1】:

    我认为您没有以正确的方式使用 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"));
        }
    
    }
    

    【讨论】:

    • 嘿,谢谢。我选择了第一个选项,模拟 getValues() 方法。
    • @AntonCherkashyn 很高兴为您提供帮助。感谢您的打勾
    • 你不应该 mock() 被测类,这不是测试的工作方式。模拟类的依赖关系,以激发测试中的所需行为。在这种情况下,根本没有理由模拟任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2019-12-11
    相关资源
    最近更新 更多