微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检查注入服务中是否调用了方法?

如何解决如何检查注入服务中是否调用了方法?

我正在编写 Micronaut 测试来测试我的缓存功能。有一个 Service Singleton 类,它具有常规的 @Cacheable、@CacheInvalidate 注释方法。服务类中的方法调用 Repository 类,该类与数据库联系以获取所需的数据。

为了测试缓存,我使用@Inject 和@Spy 注释注入了服务,并为存储库注入了@MockBean。我添加一个存根以使用 Mockito.when(repo.fetch("X")).thenReturn(DB Object) 从 Repository Mock 返回一些虚拟数据。现在,当我打电话给服务时。我可以使用 Mock.verify 检查我的存储库是否第一次被调用。但我也想验证是否调用了我的服务中的方法。我尝试使用 Mockito.verify(Service).method("X") 但它没有说对象不是 Mock。

那么,如何验证我的方法是否被调用?继续,我还想确认当我传入相同的参数时,我的方法没有被调用(因为它会在第一次调用后被缓存)。

解决方法

如何验证我的方法是否被调用?

您可以使用 verify 方法。

以下示例来自micronaut-projects.github.io/micronaut-test/2.3.7/guide/#junit5

package io.micronaut.test.junit5;

import io.micronaut.test.annotation.MockBean;
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

import javax.inject.Inject;

import static org.mockito.Mockito.*;

@MicronautTest
class MathMockServiceTest {

    @Inject
    MathService mathService; 


    @ParameterizedTest
    @CsvSource({"2,4","3,9"})
    void testComputeNumToSquare(Integer num,Integer square) {

        when(mathService.compute(10))
            .then(invocation -> Long.valueOf(Math.round(Math.pow(num,2))).intValue());

        final Integer result = mathService.compute(10);

        Assertions.assertEquals(
                square,result
        );
        verify(mathService).compute(10); 
    }

    @MockBean(MathServiceImpl.class) 
    MathService mathService() {
        return mock(MathService.class); 
    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。