我正在使用Junit 4.8.2。当我使用 @RunWith(MockitoJUnitRunner.class)
运行我的测试类并只用 @Mock 注释模拟时,它似乎没有初始化模拟。但是当我使用静态 mock() 并摆脱运行器和注释时,我可以看到模拟已初始化。
@RunWith(MockitoJUnitRunner.class)
public class MyTestClass
{
private static final String DOMAIN = "mock";
@Mock private TransactionManager transactionManager;
@Mock private SearchManager searchManager;
private final filter = new Filter(transactionManager,searchManager, DOMAIN);
@Test
public void myTest()
{
filter.callMethod(); // This throws NPE since transactionManager was null
}
}
我在这里做错了什么?我已经研究了这个初始化模拟对象 - MockIto 并根据它做了所有事情,但仍然没有运气。
运行器在类实例化后处理@Mock
注释,因此在@Before
注释方法中移动filter = new Filter(transactionManager,searchManager, DOMAIN);
:
@RunWith(MockitoJUnitRunner.class)
public class MyTestClass
{
private static final String DOMAIN = "mock";
@Mock
private TransactionManager transactionManager;
@Mock
private SearchManager searchManager;
private Filter filter;
@Before
public void setup() throws Exception {
filter = new Filter(transactionManager, searchManager, DOMAIN);
}
@Test
public void myTest() throws Exception {
filter.callMethod(); // No more NPE
}
}
从运行器文档:
初始化用
@Mock
注释的模拟,因此不需要显式使用MockitoAnnotations.initMocks(Object)
。模拟在每个测试方法之前初始化。
尝试初始化模拟,向测试类添加设置方法。
您可能还需要在其中移动filter
初始化:
private filter;
@Before
public void setUp(){
MockitoAnnotations.initMocks(this);
filter = new Filter(transactionManager,searchManager, DOMAIN);
}
您可以在测试对象上使用@InjectMock
。如果使用 @InjectMock
,它将使用模拟对象来创建测试对象。