我一直在学习更多关于Java中的Mockito框架的知识,我不知道该怎么做才能完成这个单元测试。
基本上,来自控制台的错误表明,当Bar.sayHi((方法尝试从Foo测试运行时,存在NullPointerException。我怀疑这与自动连线字段有关(但我可能错了(?
下面是我遇到的问题的简单示例:
@RunWith(MockitoJUnitRunner.class)
public class FooTest {
@Mock
//@Spy // Cannot spy on an interface
IBar bar;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void test() {
// Given
FooImpl foo = new FooImpl();
foo.saySaySay();
// When
// Then
}
}
这是正在测试的 FooImpl 类(有一个 Foo 的接口(:
public class FooImpl implements IFoo {
@Autowired
private IBar bar;
public void saySaySay() {
bar.sayHi();
}
}
还有 Bar 类(还有一个 Bar 接口(:
public class BarImpl implements IBar {
@Override
public void sayHi() {
System.out.println("hello");
}
}
有人对此有建议吗?谢谢。
仅创建 Ibar 的模拟不会将该模拟注入@Autowired字段。自动布线是Spring的工作,而不是Mockito的工作。您需要显式告诉 mockito 使用@InjectMock将它们注入到测试对象中
@RunWith(MockitoJUnitRunner.class)
public class FooTest {
@InjectMocks
FooImpl foo;
@Mock
IBar bar;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void test() {
foo.saySaySay();
}
}
或手动设置测试对象内的模拟对象。
@Test
public void test() {
FooImpl foo = new FooImpl();
ReflectionTestUtils.setField(foo, "bar", bar);
foo.saySaySay();
}
RunWith(MockitoJUnitRunner.class)
public class FooTest {
@Mock
//@Spy // Cannot spy on an interface
IBar bar;
@InjectMocks
private FooImpl foo;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void test() {
// Given
foo.saySaySay();
verify(bar).sayHi();
// When
// Then
}
}