这是我的问题。
设置:
- 我有类 A,它有一个类 B 的私有成员变量。
- 类 A 中的方法(方法1)调用非静态方法(方法2)在B类。
- 类 B 实际上从受保护的抽象类 C 继承方法2,并且不会覆盖它。
问题:
- 我正在为 A 类编写测试。
- 在测试中,我正在模拟对方法2的调用。
示例代码:
B b = Mockito.mock(B.class);
A a = new A(b);
Mockito.when(b.method2()).thenReturn(MY_LIST);
- 现在当我调用方法1(又调用方法2)时,我得到一个
空指针异常。
示例代码:
a.method1();
- 我假设这个调用完全独立于 method2 的实现,因为我在嘲笑它。有错吗?如果不是,我做错了什么?
PS:C 类受到保护,A 类与 B 类和 C 类处于不同的包装中。
我看到你在测试中使用了Mockito。我最近在一个项目中使用它,并用以下内容做了一个测试项目。
首先,一个服务(A)使用另一个类(B)。
public class Service {
private NonStaticClass nonStatic;
public NonStaticClass getNonStatic() {
return nonStatic;
}
public void setNonStatic(NonStaticClass nonStatic) {
this.nonStatic = nonStatic;
}
public int useStaticService () {
return 2*StaticClass.staticMethod();
}
public Integer getLastUse () {
return this.nonStatic.getLastUse();
}
}
那么这里是 (B) 类:
public class NonStaticClass {
private Integer lastUse = new Integer(0);
public Integer getLastUse() {
return lastUse++;
}
}
为了测试一切是否正常工作,我为它创建了一个测试。
import static org.mockito.Mockito.when;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class TestNonStaticMock {
private final Integer staticMethodOutput = 10;
@Mock
NonStaticClass mock = new NonStaticClass();
@InjectMocks
Service service = new Service();
@Before
public void before () {
setMock();
}
private void setMock() {
when(mock.getLastUse()).thenReturn(staticMethodOutput);
}
@Test
public void mockNonStaticMethod () {
Integer result = service.getLastUse();
System.out.println(result.toString());
Assert.assertEquals(staticMethodOutput, result);
}
}
希望它能有用。