Mockito:将类mock注入到私有接口字段中



我正在使用Mockito 1.9.5进行一些单元测试。我试图将一个具体的类mock注入到一个具有私有接口字段的类中。这里有一个例子:

一级正在测试

@Component
public class Service {
    @Autowired 
    private iHelper helper;
    public void doSomething() {
        helper.helpMeOut();
    }
}

我的此类测试

@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {
    @Mock
    private iHelper helper;
    @InjectMocks
    private Service service;
    @Before
    public void setup() {
        service = new Service();
    }
    @Test
    public void testStuff() {
        doNothing().when(helper).helpMeOut();
        service.doSomething();
    }
}

当尝试在doSomething()中调用helper.helpMeOut()时,此代码引发NullPointerException。我进行了调试,在运行测试时发现helper为null。我还尝试将iHelper更改为具体的类Helper,同样的问题也发生了。

有什么建议吗?如何让Mockito正确地将mock注入接口私有字段?

@acdcjunior的评论帮助我解决了这个问题。使用new关键字实例化服务导致Spring无法正确注入依赖项(在本例中为helper)。我在测试中通过自动布线解决了这个问题。我的最终工作代码如下:

一级正在测试

@Component
public class Service {
    @Autowired 
    private iHelper helper;
    public void doSomething() {
        helper.helpMeOut();
    }
}

我的此类测试

@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {
    @Mock
    private iHelper helper;
    @InjectMocks
    @Autowired
    private Service service;
    @Test
    public void testStuff() {
        doNothing().when(helper).helpMeOut();
        service.doSomething();
    }
}

希望这能帮助其他人。谢谢你的建议!

根据文档,您缺少设置。

@Before
public void initMocks() {
    MockitoAnnotations.initMocks(this);
}

已编辑*

看看这个页面,为什么不应该使用@InjectMock来自动连接字段

最新更新