Pig*_*lvy 9 java abstract-class unit-testing mockito
我正在尝试测试一个抽象类,而Mockito没有初始化我的成员变量.这是一个向您展示我的问题的简单示例.
这是一个初始化其"field"成员的抽象类:
import java.util.ArrayList;
import java.util.Collection;
public abstract class Foo {
private final Collection field = new ArrayList();
protected Foo() {
System.out.println("In constructor");
}
public boolean isNull(Object o) {
field.add(o);
return o == null;
}
abstract void someAbstractMethod();
}
Run Code Online (Sandbox Code Playgroud)
这里的测试类:
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
public class FooTest {
@Test
public void testSomething() {
final Foo foo = Mockito.mock(Foo.class);
Mockito.when(foo.isNull(Mockito.anyObject())).thenCallRealMethod();
Assert.assertFalse(foo.isNull("baaba"));
}
}
Run Code Online (Sandbox Code Playgroud)
当测试运行时,它会抛出一个NPE,因为变量'field'没有被初始化!
我究竟做错了什么?
这是预期的行为,当您模拟某些内容时,创建的实例是一个完整的模拟,因此将字段初始化为默认行为是没有意义的。
除此之外,字段可以由具体或抽象类中的构造函数初始化,因为模拟实例化绕过构造函数仅仅因为它是模拟,初始化它们更加不合理。
在使用模拟时,试图调用真正的方法通常是错误的。相反,应该存根模拟的行为。
Mockito.when(foo.isNull(Mockito.anyObject())).thenReturn(false);
Assert.assertFalse(foo.isNull("baaba")); // assertion always passing
Run Code Online (Sandbox Code Playgroud)
我不知道你的实际用例,但也许你想要一个部分模拟,带有spy. 尽管这仍然被认为是不好的做法,因为它通常意味着您需要重构代码以使用组合。
| 归档时间: |
|
| 查看次数: |
7111 次 |
| 最近记录: |