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

时间:2016-07-08 18:41:02

标签: java unit-testing junit mockito

我正在使用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
    }
}

我在这里做错了什么?我已经调查了这个Initialising mock objects - MockIto并按照它做了所有事情,但仍然没有运气。

3 个答案:

答案 0 :(得分:3)

运行器在实例化类之后处理.flex-box { display: flex; flex-direction: column; } .flex-box .input-w { display: flex; flex-direction: row; } 注释,因此在@Mock带注释的方法中移动filter = new Filter(transactionManager,searchManager, DOMAIN);

@Before

来自runner doc

  

初始化使用@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在每种测试方法之前初始化模拟。

答案 1 :(得分:1)

尝试初始化模拟,为测试类添加设置方法。

您可能还需要在其中移动filter初始化:

private filter;

@Before
public void setUp(){
    MockitoAnnotations.initMocks(this);
    filter = new Filter(transactionManager,searchManager, DOMAIN);
}

答案 2 :(得分:0)

您可以在测试对象上使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <div class="header"> <div id="header-sroll"> <h1>Fixed Header</h1></div> </div>。如果使用@InjectMock,它将使用模拟对象来创建测试对象。<​​/ p>