【问题标题】:MOCKITO How to mock object method if object is not a beanMOCKITO 如果对象不是 bean,如何模拟对象方法
【发布时间】:2021-03-28 05:26:45
【问题描述】:

在我正在测试的方法中,我有这个:

val client = PushClient() 
... 
client.sendPushNotificationsAsync(chunk)

如您所见,PushClient 不是 bean...我如何模拟 sendPushNotificationsAsync 方法?

这样尝试过,但不起作用,没有被调用...

        val mockPushClient = mock(PushClient::class.java)
        val ticket = ExpoPushTicket()
        ticket.status = Status.OK
        val cf = CompletableFuture.completedFuture(listOf(ticket))
        Mockito.doReturn(cf).`when`(mockPushClient).sendPushNotificationsAsync(any())

【问题讨论】:

  • 如果client 是实例或方法范围变量并且这很重要,您的问题并不清楚。
  • 我以前也遇到过你的情况。如果您使用的是 Spring,那么正确的做法是定义一个 bean 并将其作为依赖项注入到您的类中。这样你就可以测试它了。如果您的项目可行,这将是您的最佳选择。
  • 我想说的和@StefanZhelyazkov 差不多,即测试对象不应该创建 PushClient 实例本身,而应该只依赖于该对象。这将使使用 Mockito 更容易模拟它。在这种情况下,我还发现 JMockit 有助于克服无法更改测试主题但没有在 Kotlin 中大量使用它的情况——不过,我认为它可以工作。

标签: spring-boot unit-testing kotlin testing mockito


【解决方案1】:

使用

ReflectionTestUtils.setField(Object targetObject, String name, @Nullable Object value) 

模拟非 bean 对象的方法。

【讨论】:

    【解决方案2】:

    从您的问题中不清楚客户端是实例还是方法范围的变量,这很重要。

    在后一种情况下,您可以执行以下操作:

    public class ClassUnderTest{
        
        public void methodUnderTest(){
            val client = getClient(); //now we can override
        }
        
        protected PushClient getClient(){
            return new PushClient();
        }
    }
    
    pubic class TestClass{
    
        private ClassUnderTest testClass = new TestableClassUnderTest();
        
        public void testMethodUnderTest(){
            //dostuff
        }
    
        //extends the class being tested so we can return a mock client
        protected class TestableClassUnderTest extends ClassUnderTest{
            @Override
            public PushClient getClient(){
                PushClient client = Mockito.mock(PushClient.class);
                //configure mock 
    
                return client;
            }
        }
        
    }
    

    否则,使用 PowerMock 设置私有实例变量。

    【讨论】:

    • 所以这里是简化版 我有一个服务,它有一个 sendNotification 方法 `` sendNotification(notification){ v​​al client = PushClient() /* PushClient 是来自外部库的类 */ val response = client .sendPushNotificationsAsync(通知) }
    • 按照我当时的建议去做。
    • 我想模拟 sendPushNotificationsAsync 方法,所以它不会在外部服务器/api上发送通知
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多