Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模拟类会将null赋值给@NonNull字段(Android)_Java_Android_Unit Testing_Mockito_Non Nullable - Fatal编程技术网

Java 模拟类会将null赋值给@NonNull字段(Android)

Java 模拟类会将null赋值给@NonNull字段(Android),java,android,unit-testing,mockito,non-nullable,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

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


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

我认为您没有正确使用Mockito,因为您必须定义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"));
  }

}
@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"));
}
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很乐意帮忙。谢谢你的提醒,你不应该模仿被测试的类,这不是测试的工作方式。模拟类的依赖关系,以激发测试中所需的行为。在这种情况下,根本没有理由嘲笑任何东西。