@RunWith(MockitoJUnitRunner.class)不初始化模拟



我正在使用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 ,它将使用模拟对象来创建测试对象。

最新更新