Java 模拟类会将null赋值给@NonNull字段(Android)
我正在使用Android SDK和junit4+Mockito进行单元测试。假设我的应用程序中有这样一个类: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
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很乐意帮忙。谢谢你的提醒,你不应该模仿被测试的类,这不是测试的工作方式。模拟类的依赖关系,以激发测试中所需的行为。在这种情况下,根本没有理由嘲笑任何东西。