【问题标题】:@RunWith(MockitoJUnitRunner.class) doesn't initialize mocks [duplicate]@RunWith(MockitoJUnitRunner.class) 不初始化模拟[重复]
【发布时间】:2016-07-08 18:41:01
【问题描述】:

我正在使用 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 并按照它做了所有事情,但仍然没有运气。

【问题讨论】:

标签: java unit-testing junit mockito


【解决方案1】:

运行器在类实例化之后处理@Mock注解,因此将filter = new Filter(transactionManager,searchManager, DOMAIN);移动到@Before注解方法中:

@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
    }
}

来自runner doc

初始化带有@Mock 注释的模拟,因此不需要显式使用MockitoAnnotations.initMocks(Object)在每个测试方法之前初始化模拟。

【讨论】:

    【解决方案2】:

    尝试初始化你的模拟,向你的测试类添加一个设置方法。

    您可能还需要将 filter 初始化移到其中:

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

    【讨论】:

    • 是的,我确实必须移动过滤器对象。但是我们不需要 MockitoAnnotations.initMocks(this);如果我们使用跑步者
    • 但是你需要在初始化过滤器之前初始化它们,所以就是这样。
    • 我猜你可以将过滤器移到测试内部并删除 initMocks
    【解决方案3】:

    您可以在您的测试对象上使用@InjectMock。如果您使用 @InjectMock ,它将使用模拟对象来创建您的测试对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 2013-03-07
      • 2011-06-18
      相关资源
      最近更新 更多