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

在没有PowerMock的情况下监视类

邵文乐
2023-03-14

我不想再使用powermock了。因为junit5开始模拟静态类。因此,我试图摆脱powermock方法。

当我使用PowerMock时,我可以很容易地发现一个具有私有构造函数的类,然后我调用静态方法。

这是我代码的一部分(当我使用PowerMock时)

@RunWith(PowerMockRunner.class)
@PrepareForTest(MessageValidationUtils.class)
public class MessageValidationServiceTest {

    @Mock
    private CheckpointCustomerService checkpointCustomerService;


    @Mock
    private ProductClientService productClientService;


    @Before
    public void setUp() {
        MockitoAnnotations.openMocks(this);
        PowerMockito.spy(MessageValidationUtils.class);
}

在我做了MessageValidationUtils.class的间谍对象后,我正在测试这个:

when(MessageValidationUtils.validateTelegramKeyMap(messageProcessDto.getMessageMessageType(),
        messageProcessDto.getMessageKeyValueMap())).thenAnswer((Answer<Boolean>) invocation -> true);

经过一些研究,我找不到任何与监视一个具有私有构造函数和静态方法的类相关的东西。

共有1个答案

翁鸿远
2023-03-14


在Mockito中定义期间,您可以指定默认情况下执行实际执行的设置。withSettings()。defaultAnswer(Mockito.CALLS\u REAL\u方法)。这样,静态模拟将像间谍一样工作
让我们为测试创建简单的UTIL类。

public class Utils {
    public static String method1() {
        return "Original mehtod1() value";
    }

    public static String method2() {
        return "Original mehtod2() value";
    }

    public static String method3() {
        return method2();
    }
}

method 2制作mock并执行method 1method 3的实际执行

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
import org.mockito.Mockito;

public class SpyStaticTest {
    @Test
    public void spy_static_test() {
        try (MockedStatic<Utils> utilities = Mockito.mockStatic(Utils.class, Mockito.withSettings().defaultAnswer(Mockito.CALLS_REAL_METHODS))) {
            utilities.when(Utils::method2).thenReturn("static mock");

            Assertions.assertEquals(Utils.method1(), "Original mehtod1() value");
            Assertions.assertEquals(Utils.method2(), "static mock");
            Assertions.assertEquals(Utils.method3(), "static mock");
        }
    }
}

班级示例:

    @Test
    public void test() {
        try (MockedStatic<MessageValidationUtils> utilities = Mockito.mockStatic(MessageValidationUtils.class, Mockito.withSettings().defaultAnswer(Mockito.CALLS_REAL_METHODS))) {
            utilities.when(() -> MessageValidationUtils.validateTelegramKeyMap(messageProcessDto.getMessageMessageType(),
                    messageProcessDto.getMessageKeyValueMap())).thenAnswer((Answer<Boolean>) invocation -> true);
            
            //perform testing of your service which uses MessageValidationUtils
        }
    }
 类似资料:
  • 我有一个带有私有方法的类,该方法调用一些外部类并执行它,如果不使用powermock,我如何防止这种情况发生?(该项目使用Junit5,目前还不支持powermock)。 我考虑过将这些函数移到外面,但我觉得有时方法确实属于特定的类,因为它们是它的一部分,将它们移出对我来说没有意义,下面只是一个例子来说明。 我已经知道大多数人会说不要测试私有方法,但a.我不完全同意,b.我不想在这里测试这个方法,

  • 问题内容: 有一个大型的python项目,其中一类的一个属性在某处只是错误的值。 它应该是sqlalchemy.orm.attributes.InstrumentedAttribute,但是当我运行测试时,它是恒定值,比方说字符串。 有某种方法可以在调试模式下运行python程序,并在每一步自动通过代码行之后运行一些检查(如果变量更改了类型)? PS我知道如何在检查和属性装饰器的帮助下记录类实例的

  • 文档说这个库运行在GPU上。如果我功能强大的笔记本电脑没有GPU,我还能运行Deeplearning4J吗?

  • 我正在使用Transform创建一个windows安装包,使其成为多实例。我的mst文件更新了某些注册表项组件的产品代码和GUID。这是每台机器安装。现在我无法卸载我的产品,如果: 我的mst文件从其原始位置删除 TransformsSecure策略设置为1 安装程序尝试在原始位置查找mst文件,但无法执行此操作,卸载失败。在这两种情况下,我可以做什么让我的产品卸载? 一些额外信息。我看到我的ms

  • 我看到的所有解决方案都需要使用。但是,我想在Eclipse之外的单个文件上使用CDT解析器。那有什么办法吗?

  • 本文向大家介绍Linux下监视NVIDIA的GPU使用情况详解,包括了Linux下监视NVIDIA的GPU使用情况详解的使用技巧和注意事项,需要的朋友参考一下 在使用TensorFlow跑深度学习的时候,经常出现显存不足的情况,所以我们希望能够随时查看GPU时使用率。如果你是Nvidia的GPU,那么在命令行下,只需要一行命令就可以实现。 1. 显示当前GPU使用情况 Nvidia自带了一个nvi