繁体   English   中英

Mockito:将类模拟注入私有接口字段

[英]Mockito: inject a class mock into a private interface field

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

我正在测试

@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正确地将模拟注入接口私有字段?

@ 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来自动装配字段

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM