首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用mockito在ReentrantReadWriteLock中模拟JUnit

用mockito在ReentrantReadWriteLock中模拟JUnit
EN

Stack Overflow用户
提问于 2018-02-21 04:53:33
回答 2查看 1.4K关注 0票数 2

在我的实现类中,我有一个读写锁定义,如下所示,

代码语言:javascript
复制
@Inject
@Named("CustomizedLock")
private ReentrantReadWriteLock rwLock;

我在一个名为run()的方法中使用它,

代码语言:javascript
复制
rwLock.writeLock().lock();

锁定过程。但是当我试图用mockito测试时,我发现ReentrantReadWriteLock是初始化的。但是当我试图得到rwLock.writeLock()时,它是空的。这是我的测试。

代码语言:javascript
复制
@Mock
private ReentrantReadWriteLock feedReadWriteLock;

@InjectMocks
private CustomModule module = mock(CustomModule.class);

/////////////////////////

@Test
public void test() {
    when(module.getReadWriteLock()).thenReturn(mock(ReentrantReadWriteLock.class));
    PowerMockito.doReturn(new ReentrantReadWriteLock()).when(module.getReadWriteLock());
    cacheJob.run();
}

正如我所说,rwLock.writeLock()为null,但rwLock是初始化的。请解释一下莫奇托是怎么发生的。最理想的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-21 12:35:55

你嘲笑错了:

代码语言:javascript
复制
@Mock
private ReentrantReadWriteLock feedReadWriteLock;

上面的内容创建了一个模拟,然后在测试的中以某种方式进入您的类。

但这一点:

代码语言:javascript
复制
@InjectMocks
private CustomModule module = mock(CustomModule.class);

是假的。InjectMocks注释的存在是为了为您完成“将其放入”部分。

换句话说,你应该做的事情如下:

代码语言:javascript
复制
@Mock
private ReentrantReadWriteLock feedReadWriteLock;

@InjectMocks
private CustomModule module = new CustomModule();

例如。换句话说:您做的是,而不是,它模拟被测试类的实例。您创建一个“真实”实例,然后必须将所需的模拟对象“插入”到该实际实例中。完全没有必要嘲笑被测试的类。因为您希望测试您的代码,而不是模拟框架为您所模仿的东西。

InjectMocks注释试图为您做到这一点(使用反射和各种黑魔法)。不幸的是,当它不能完成它的工作时,它只是默默地失败了。

从这个意义上说,答案是:不要只是盲目地使用东西。您必须完全理解,理解您编写的每一行代码。因此:阅读this来理解这些注释之间的区别。

为了记录在案:请注意,您还必须使用Mockito JUnitRunner或手动调用Mockito.initMocks(),这样才能让注释发挥它们的魔力。

票数 2
EN

Stack Overflow用户

发布于 2018-02-21 12:43:06

如果您想模拟测试中的类,则应该使用@Spy

代码语言:javascript
复制
@RunWith(MockitoJUnitRunner.class)
public class CustomModuleTest {
    @Mock
    private ReentrantReadWriteLock feedReadWriteLock;

    @Spy
    @InjectMocks
    private CustomModule module;

    @Test
    public void test() {
        doReturn(feedReadWriteLock).when(module).getReadWriteLock();
        cacheJob.run();
    }
}

请注意,间谍的语法与模拟稍有不同。间谍允许您实例化真实的对象,但是可以根据您的意愿模拟一些方法。

在这里,我返回feedReadWriteLock,这是与@Mock一起注意到的,这样,您就可以改变它的行为。您不想像在示例中那样返回一个新实例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48898398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档