Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing Junit5模拟静态方法_Unit Testing_Mockito_Powermock_Junit5 - Fatal编程技术网

Unit testing Junit5模拟静态方法

Unit testing Junit5模拟静态方法,unit-testing,mockito,powermock,junit5,Unit Testing,Mockito,Powermock,Junit5,我想在junit5中模拟一个静态方法。但不幸的是,Junit5不支持Powermockito。除了恢复到Junit4之外,还有其他方法可以达到同样的效果吗?Mockito目前不提供静态方法模拟的原因是因为人们普遍认为静态方法不需要模拟。 然而,mockito还有一个未完成的项目讨论了这个问题。 虽然这并不能回答您的问题,但一般来说,它会告诉您为什么根本不需要该功能,或者允许您加入到对话中,表达您的想法 简短的回答是否定的,因为PowerMockito团队已经完成了他们的任务,正在等待JUnit团

我想在junit5中模拟一个静态方法。但不幸的是,Junit5不支持Powermockito。除了恢复到Junit4之外,还有其他方法可以达到同样的效果吗?Mockito目前不提供静态方法模拟的原因是因为人们普遍认为静态方法不需要模拟。 然而,mockito还有一个未完成的项目讨论了这个问题。
虽然这并不能回答您的问题,但一般来说,它会告诉您为什么根本不需要该功能,或者允许您加入到对话中,表达您的想法

简短的回答是否定的,因为PowerMockito团队已经完成了他们的任务,正在等待JUnit团队在这里进行大量讨论

您可以使用一些开销:因为JUnit5提供了运行遗留JUnit4的支持,在那里您可以使用PowerMockito。因此,您可以在Junit4中为以下情况创建测试: 使用和进行迁移设置的示例项目。 在这里,我将与Mockito2一起使用。

从Mockito 3.4.0(2020年7月10日)开始,即使在JUnit 5中,也可以开箱即用地模拟静态方法,而无需任何扩展

在文档中,您可以找到一个示例:

重要提示:您需要使用内联模拟生成器。因此,要使用的依赖项不是核心依赖项:


org.mockito
莫基托内联
3.4.6
测试
例如: 测试类别:

包测试静态;
公共类食品统计{
公共静态长n参数(){
返回系统.currentTimeMillis();
}
公共静态字符串oneParameter(字符串参数1){
返回param1.toUpperCase();
}
}
测试等级:

包测试静态;
导入org.junit.jupiter.api.Test;
导入org.mockito.MockedStatic;
导入静态org.junit.jupiter.api.Assertions.*;
导入静态org.mockito.mockito.*;
公共类FooWithStaticTest{
@试验
void testStatic(){
//在模拟范围之前,通常的行为。
assertNotEquals(0L,FooWithStatics.noParameters());
assertNotEquals(“yyy”,FooWithStatics.oneParameter(“xxx”);
//模拟范围
try(MockedStatic mocked=mockStatic(FooWithStatics.class)){
//嘲弄
mocked.when(FooWithStatics::noParameters)。然后返回(0L);
mocked.when(()->FooWithStatics.oneParameter(“xxx”))。然后返回(“yyy”);
//嘲弄行为
assertEquals(0L,FooWithStatics.noParameters());
assertEquals(“yyy”,FooWithStatics.oneParameter(“xxx”);
//验证模拟。
模拟。验证(次数(1),FooWithStatics::noParameters);
模拟。验证(次数(1),()->footwithstatics.oneParameter(“xxx”);
}
//模拟范围返回到正常行为之后。
assertNotEquals(0L,FooWithStatics.noParameters());
assertNotEquals(“yyy”,FooWithStatics.oneParameter(“xxx”);
}
}

如果我们需要模拟对System.getenv的调用,则通常需要这样做,我不认为这是一种坏模式。如果我是,请纠正我wrong@Yeikel您提到的场景应该由UT框架处理,事实上,可以使用JUnit4中的规则或JUnit5中的扩展来解决它。这是真的,不支持开箱即用,但有一些聪明的方法可以通过扩展来实现。您能将我链接到任何有关这方面的参考资料吗?我们正在考虑降级到Junit4,只是因为缺少此功能。您不需要降级。最坏的情况是,您仍然可以使用扩展名调用的@rule。我将为您准备一个例子。从Mockito 3.4,可以开箱即用。请检查我的答案和示例。另请参阅一个简单的三步示例,链接到发布的博客文章。@angelcervera使用mockedStatic如何模拟静态void方法?对于返回类型为void的方法,我不能使用上述指令。