当前位置: 首页 > 知识库问答 >
问题:

用mockito模拟JUnit中的ReentrantReadWriteLock

潘高洁
2023-03-14

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

@Inject
@Named("CustomizedLock")
private ReentrantReadWriteLock rwLock;

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

rwLock.writeLock().lock();
@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是初始化的。请解释Mockito是如何发生这种情况的。理想的方法是什么?

共有1个答案

冷翼
2023-03-14

你嘲笑错了:

@Mock
private ReentrantReadWriteLock feedReadWriteLock;

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

但是这个:

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

@InjectMocks
private CustomModule module = new CustomModule();

例如。换句话说:您不能模拟测试中的类的实例。您创建了一个“真实”实例,然后必须将所需的模拟对象“插入”到该真实实例中。嘲笑被测试的班级是绝对没有意义的。因为您想测试您的代码,而不是模仿框架为您模仿的东西。

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

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

为了记录在案:请注意,您还必须使用Mockito JUnitRunner或手动调用Mockito.initMocks(),以便注释发挥其作用。

 类似资料:
  • 以前从未见过这个问题——当使用或而测试失败时,Mockito的职业列表指向JUnit代码,而不是应用程序代码: 我使用的是Mockito和JUnit。代码非常标准: 首先,我还使用了规则: ...这导致了其他问题,因为它将Mockito的验证失败捕获为意外异常: 我正在开发一个新的代码库,以前从未见过这个问题。似乎Mockito或JUnit清除堆栈跟踪的力度太大或是其他什么。。。 我可以在没有的情

  • org.mockito.exceptions.misusing.invaliduseofmatchersexception:在此处检测到错误的参数匹配器:->at service.activity.service.activitesServiceTest.setup(activitesServiceTest.java:45) 不能在验证或短截之外使用参数匹配器。参数匹配器的正确用法示例:when(

  • 问题内容: 我对模拟还很陌生,并且我一直在尝试模拟实际内容(本质上仅在内存中创建一个虚拟文件),以便在任何时候都不会将任何数据写入磁盘。 我尝试过模拟文件和模拟尽可能多的属性的解决方案,然后还使用文件写入器/缓冲写入器将其写入,但是这些方法不能很好地工作,因为它们需要规范路径。有人找到了除此以外的解决方案,但我正在解决这个错误? 我一直在这样做: 任何想法或指导都将非常有帮助。在此之后的某个地方,

  • 我尝试测试一个发送jms消息的类,但无法模拟JmsTemplate JmsProducer.class: JmsProducerTest。类别: 当我运行这个测试用例时,它给了我:java。lang.IllegalArgumentException:对象不是声明类的实例 你对这个问题有什么想法吗?

  • 基类 在派生类中不应用组合和其他函数。如果是,我是否应用了错误的模式?我应该如何处理相同的?

  • 使用mockito模拟一个方法会确保永远不会调用被模拟的方法吗?我有一个主类,它包含一些我想为其编写单元测试的代码,还有一个单元测试类MainTest,它包含主类的单元测试。 eg: 源类: JUnit测试(使用mockito) 这项测试失败了。为什么?