在mockito中使用argumentmatchers时遇到问题()

gwo2fgha  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(447)

我正在用mockito编写一些单元测试,我遇到了以下情况:

AmazonS3 mockedS3 = Mockito.mock( AmazonS3.class )

Bucket mockBucket = Mockito.mock( Bucket.class )
Mockito.when( mockBucket.getName() ).thenReturn("bucket-1-pub")

Mockito.when(mockedS3.doesBucketExistV2("bucket-1-pub")).thenReturn(false)

// here I'm setting up a mock that accepts any CreateBucketRequest
Mockito.when( mockedS3.createBucket(any(CreateBucketRequest.class)) )
    .thenReturn( mockBucket )

// execute the code under test
String result = doSomething()

// this is the line of the error where it doesn't see a call to createBucket 
// for any CreateBucketRequest
Mockito.verify( mockedS3 ).createBucket( any(CreateBucketRequest.class) )

下面是我得到的错误:

Wanted but not invoked:
amazonS3.createBucket(
  <any com.amazonaws.services.s3.model.CreateBucketRequest>
);
-> at com.amazonaws.services.s3.AmazonS3$createBucket$3.call(Unknown Source)

However, there were exactly 2 interactions with this mock:
amazonS3.doesBucketExistV2("bucket-1-pub");
-> at com.fuseanalytics.archiver.model.dao.AmazonFileDao.checkBucket(AmazonFileDao.java:142)

amazonS3.createBucket(
  com.amazonaws.services.s3.model.CreateBucketRequest@255e5e2e
);
-> at com.fuseanalytics.archiver.model.dao.AmazonFileDao.checkBucket(AmazonFileDao.java:147)

Wanted but not invoked:
amazonS3.createBucket(
  <any com.amazonaws.services.s3.model.CreateBucketRequest>
);
-> at com.amazonaws.services.s3.AmazonS3$createBucket$3.call(Unknown Source)

However, there were exactly 2 interactions with this mock:
amazonS3.doesBucketExistV2("bucket-1-pub");
-> at com.fuseanalytics.archiver.model.dao.AmazonFileDao.checkBucket(AmazonFileDao.java:142)

amazonS3.createBucket(
  com.amazonaws.services.s3.model.CreateBucketRequest@255e5e2e
);
-> at com.fuseanalytics.archiver.model.dao.AmazonFileDao.checkBucket(AmazonFileDao.java:147)

从追踪到我的电话 amazonS3.createBucket() 呼叫是用 CreateBucketRequest ,而不是返回 mockBucket 我已经配置好了。它只返回null,然后当我验证调用它时,调用与verify和bramo exception city的条件不匹配。
更新:我尝试过的方法是移动 when() 调用,以便它们与在代码中调用方法的顺序保持一致。没用(我很高兴那没用,因为那有多可怕?!黑匣子测试就这么多了,对吧?)我也试着移除 verify() 需要 createBucket() . 因为createbucket()仍然没有返回我配置的内容,所以导致下一个verify(图中没有)崩溃。
我看不出这是怎么回事,所以我需要一些帮助来看看我的错误。

tag5nh1u

tag5nh1u1#

好吧,我遗漏了一个重要的细节,我向那些评论我的人道歉。我正在用groovy编写测试。结果是groovy的错。我开始怀疑groovy正在向对象添加它的groovy方法,这可能会使它们在mockito看来不一样。所以虽然它说它和createbucket(createbucketrequest)有一个交互。当使用任何()匹配器时,它不会将createbucketrequest和createbucketrequest+groovy默认方法识别为同一个东西。
现在,为什么会发生这种情况是由mockito开发人员来弄清楚的。我想我应该用斯波克而不是junit,但那是另一天的事了。谢谢你的帮助。

相关问题