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

丁丁:

我是使用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);
   }
}

我知道这可能是因为adminUser测试方法中设置与通过我的实际方法getUserFromOtherPlace-> MyUtils.getUserFromOtherPlace生成的引用对象不同,我也尝试使用静态方法来模拟返回对象,例如

// 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"

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

偷:

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

@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());
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章