我一直在学习Java中的Mockito框架,我对于完成这个单元测试应该怎么做了。
基本上,来自控制台的错误表明当尝试从Foo测试运行Bar.sayHi()方法时存在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");
}
}
有没有人对此提出建议?谢谢。
答案 0 :(得分:3)
只是创建一个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();
}
答案 1 :(得分:0)
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
}
}