模拟一个 class 将 null 分配给 @NonNull 字段(Android)
Mocking a class assigns nulls to @NonNull fields(Android)
我正在使用 Android SDK 和 junit4 + Mockito 进行单元测试。假设我的应用程序中有这样的 class:
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) 创建一个 class 其中 values 字段实际上设置为空,所以 values.add(value) 在 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"));
}
}
我正在使用 Android SDK 和 junit4 + Mockito 进行单元测试。假设我的应用程序中有这样的 class:
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) 创建一个 class 其中 values 字段实际上设置为空,所以 values.add(value) 在 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"));
}
}