John Smith
John Smith

Reputation: 715

Python Mockito: How do I set up async mocks?

The following code works as expected for the synchronous part but gives me a TypeError for the async call (TypeError: object NoneType can't be used in 'await' expression), presumably because the mock constructor can't properly deal with the spec. How do I properly tell Mockito that it needs to set up an asynchronous mock for async_method ?

class MockedClass():
    def sync_method(self):
        pass

    async def async_method(self):
        pass

class TestedClass():
    def do_something_sync(self, mocked: MockedClass):
        mocked.sync_method()

    async def do_something_async(self, mocked: MockedClass):
        await mocked.async_method()

@pytest.mark.asyncio
async def test():
    my_mock = mock(spec=MockedClass)
    tested_class = TestedClass()

    tested_class.do_something_sync(my_mock)
    verify(my_mock).sync_method()

    await tested_class.do_something_async(my_mock) # <- Fails here
    verify(my_mock).async_method()

Edit: For reference, this is how it works with the standard mocks (the behavior that I expect): enter image description here

Upvotes: 1

Views: 775

Answers (1)

herr.kaste
herr.kaste

Reputation: 558

In mockito my_mock.async_method() would not return anything useful by default and without further configuration. (T.i. it returns None which is not awaitable.)

What I did in the past:

# a helper function
def future(value=None):
    f = asyncio.Future()
    f.set_result(value)
    return f

# your code
@pytest.mark.asyncio
async def test():
    my_mock = mock(spec=MockedClass)
    when(my_mock).async_method().thenReturn(future(None))  #  fill in whatever you expect the method to return
    # ....

Upvotes: 2

Related Questions