来自受保护抽象方法的模拟方法
Mocking method from protected abstract method
这是我的问题的详细信息。
设置:
- 我有 class A 有一个私有成员变量 class B.
- classA中的一个方法(method1)调用了一个非静态方法(method2)
在 class B.
- Class B 实际上从受保护的抽象 class C 继承了 method2 并且没有覆盖它。
问题:
- 我正在为 class A 编写测试
- 在测试中我模拟了对 method2 的调用。
示例代码:
B b = Mockito.mock(B.class);
A a = new A(b);
Mockito.when(b.method2()).thenReturn(MY_LIST);
- 现在当我调用方法 1(它又调用方法 2)时,我得到一个
NullPointerException.
示例代码:
a.method1();
- 我假设此调用完全独立于 method2 的实现,因为我正在模拟它。那是错的吗?如果不是,我做错了什么?
PS:class C 受到保护,Class A 与 class B 和 C 在不同的包中。
我看到您在测试中使用了 Mockito。我最近在一个项目中使用了它,并用以下内容做了一个测试项目。
第一个服务 (A) 使用另一个 class (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) class:
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);
}
}
希望对你有用
这是我的问题的详细信息。
设置:
- 我有 class A 有一个私有成员变量 class B.
- classA中的一个方法(method1)调用了一个非静态方法(method2) 在 class B.
- Class B 实际上从受保护的抽象 class C 继承了 method2 并且没有覆盖它。
问题:
- 我正在为 class A 编写测试
- 在测试中我模拟了对 method2 的调用。
示例代码:
B b = Mockito.mock(B.class);
A a = new A(b);
Mockito.when(b.method2()).thenReturn(MY_LIST);
- 现在当我调用方法 1(它又调用方法 2)时,我得到一个
NullPointerException.
示例代码:
a.method1();
- 我假设此调用完全独立于 method2 的实现,因为我正在模拟它。那是错的吗?如果不是,我做错了什么?
PS:class C 受到保护,Class A 与 class B 和 C 在不同的包中。
我看到您在测试中使用了 Mockito。我最近在一个项目中使用了它,并用以下内容做了一个测试项目。
第一个服务 (A) 使用另一个 class (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) class:
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);
}
}
希望对你有用