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

用引用类型参数调用的Java mockito-verify方法

宋晋
2023-03-14

我刚开始使用Mockito,我正在验证某个方法应该用特定的参数调用,而所有的值类型参数(int、String、enum等)都可以验证,但引用/类类型参数似乎没有,下面是一个示例

// my actual class
public class MyActualClass {
   public void processRequest() {
       User curUser = MyUtils.getUserFromOtherPlace(UserType.ADMIN);
       processAnotherRequest(1, "address", curUser);
   }
   public void processAnotherRequest(int userId, String address, User user) { ... }
}
public static class MyUtils{
   public static getUserFromOtherPlace(UserType userType) {
       User newUser = new User();
       if (userType == UserType.ADMIN) {
          newUser.setAccess(1);
       }
       //...
       return newUser
   }
}

// my test class
public class MyActualClassTest{
   @Mock
   private MyActualClass myActualClass;

   @Test
   public void testIfMethodBeingCalledCorrectly() {
      User adminUser = new User();
      adminUser.setAccess(1);
      doCallRealMethod().when(myActualClass).processRequest();
      myActualClass.processRequest();
      verify(myActualClass).processAnotherRequest(1, "address", adminUser);
   }
}
// tried 1
when(MyUtils.getUserFromOtherPlace(UserType.ADMIN).thenReturn(adminUser);  // this throws error like "You cannot use argument matchers outside of verification or stubbing", and suggest using eq()
// tried 2
when(MyUtils.getUserFromOtherPlace(eq(UserType.ADMIN)).thenReturn(adminUser); //this throws NullPointer exception in getUserFromOtherPlace when check the input enum parameter "userType"

那么,我如何将引用对象传递到我的输入方法中,并在这里将其模拟为我的内部方法的返回值呢?顺便说一句,如果我的方法只包含值类型参数,它将工作...

共有1个答案

高皓
2023-03-14

因此,为了模拟您的静态方法,您需要:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ MyUtils.class })

//your test class here

@Before
public void setup() {
    PowerMockito.mockStatic(MyUtils.class);
    when(MyUtils.getUserFromOtherPlace(UserType.ADMIN).thenReturn(adminUser);
}

但是如果有其他选择,我总是不喜欢模仿静态类,所以也许你可以尝试一个参数捕获器:

//test class

@Captor
private ArgumentCaptor<User> captor;

//your test
@Test
public void testIfMethodBeingCalledCorrectly() {
    doCallRealMethod().when(myActualClass).processRequest();
    myActualClass.processRequest();
    verify(myActualClass, times(1)).processAnotherRequest(1, "address", 
        captor.capture());
    Assert.assertEquals(1, captor.getValue().getAccess());
}
 类似资料:
  • 这行不通,因为premiumStrings::contains可以接受任何对象,而不仅仅是字符串。可以将其替换为<代码>(字符串s)- (具体来说,问题是

  • 我试图模拟对resttemplate.exchange()的调用,但无法使其工作。当前,对exchange()的调用挂起,所以我认为正在调用的是实际的方法,而不是我的模拟方法。对exchange()的调用如下:

  • 本文向大家介绍C#引用类型作为方法的参数分析,包括了C#引用类型作为方法的参数分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了C#引用类型作为方法的参数。分享给大家供大家参考。具体如下: 在c#或java中,参数传递都是传递的参数本身的值, 对于值类型,传递的是值本身。 对于引用类型,定义引用类型变量的时候,一个是在栈中的变量,存储的是一个指针,指向在堆中分配的对象实例的地址,当然,如

  • 我有一个静态方法的类,如下所示: 如果我想打电话给Foo。foo并确保返回类型为,我可以说

  • 问题内容: 这是我在这里提出的问题的后续内容:奇怪的Java泛型。 如果我有这样的代码: 我可以添加静态导入并执行以下操作: Eclipse不允许这样做。但是,在Eclipse中看到如此多的静态导入错误之后,我不确定。 问题答案: 不,您不能:我只是通过一些测试代码确认了这一点。 Casts.java Test.java

  • 我试图验证一个(void)方法是否在DAO内部被调用--我正在使用一个提交点,该点发送到该点的结果列表,重置该列表并继续。假设我在列表中有4件事情,并且我有一个提交点1,我希望“send”方法被调用4次。我可以通过编写 它通过了..但我想验证它被调用的次数。我会认为 就足够了,但它说参数对验证不正确。 顺便提一下,如果我将更改为或,我会得到相同的错误。对此有什么想法?