在这里我想测试method1
.我想使用 @Mock
和 @InjectMocks
注释来实现它,但使用 class B
作为模拟,它返回 NPE。
class A {
@Autowired
private B b;
public String method1()
{
return b.method2();
}
}
class B{
@Autowired
private C c;
public String method2(){
return C.method3();
}
}
测试类 :
@InjectMocks
A a;
@Mock
B b = new B();
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void testMethod1() {
String x=a.method1();
assertEquals("value",x);
}
使用@Mock
注释时,不要手动实例化变量。
Mockito会为你做这件事,否则你最终会得到普通的实例而不是模拟:
@Mock
B b;
还要确保以某种方式设置模拟以期望某个值:
doReturn(returnString).when(b).method2();
要调用C
实际方法,请在测试类中使用@Spy
@Spy
@Autowired
private C c;
请注意,@InjectMocks也可以与@Spy注释结合使用,这意味着 Mockito 会将模拟注入到正在测试的部分模拟中。
另请注意有关将MockitoAnnotations.initMocks(this)
与@Spy
一起使用的警告:
如果你在超类构造函数中调用 MockitoAnnotations.initMocks(this(,那么这将不起作用。这是因为子类中的字段仅在超类构造函数返回后才实例化。最好使用@Before。相反,你也可以把initMocks((放在JUnit runner(@RunWith(中,或者使用内置的MockitoJUnitRunner。