Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Easymock 使用PowerMock+模拟最终方法;轻松的_Easymock_Powermock - Fatal编程技术网

Easymock 使用PowerMock+模拟最终方法;轻松的

Easymock 使用PowerMock+模拟最终方法;轻松的,easymock,powermock,Easymock,Powermock,我试图模拟对最后一个方法ResourceBundle.getString()的调用。在PowerMock 1.4.12和EasyMock 3.1中,调用没有被模拟;相反,调用“real”方法 我的测试班: @RunWith(PowerMockRunner.class) @PrepareForTest(ResourceBundle.class) public class TestSuite { @Before public void setUp() throws Exceptio

我试图模拟对最后一个方法
ResourceBundle.getString()
的调用。在PowerMock 1.4.12和EasyMock 3.1中,调用没有被模拟;相反,调用“real”方法

我的测试班:

@RunWith(PowerMockRunner.class)
@PrepareForTest(ResourceBundle.class) 
public class TestSuite {
    @Before
    public void setUp() throws Exception {
        ResourceBundle resourceBundleMock = PowerMock.createNiceMock(ResourceBundle.class);
        expect(resourceBundleMock.getString(BundleConstants.QUEUE)).andReturn("Queue");
        PowerMock.replay(resourceBundleMock);

        beanBeingTested.setMessages(resourceBundleMock);
    }
    ...
}
BeanBeingTested中的代码:

private ResourceBundle messages;
...
String label = messages.getString(BundleConstants.QUEUE);
错误消息:

java.util.MissingResourceException: Can't find resource for bundle $java.util.ResourceBundle$$EnhancerByCGLIB$$e4a02557, key Queue
at java.util.ResourceBundle.getObject(ResourceBundle.java:384)
at java.util.ResourceBundle.getString(ResourceBundle.java:344)
at com.yoyodyne.BeanBeingTested.setUpMenus(BeanBeingTested.java:87)
当我逐步完成测试用例时,调试器将
beanBeingTested.messages
的类型显示为“EasyMock for class java.util.ResourceBundle”,因此模拟被正确注入。(另外,在设置过程中,
expect()
调用中对
getString()
的调用没有错误)

如果使用普通模拟而不是漂亮的模拟,则会出现以下错误:

java.lang.AssertionError: 
  Unexpected method call handleGetObject("Queue"): 
    getString("Queue"): expected: 1, actual: 0
知道我做错了什么吗


谢谢。

为什么要嘲笑对资源包的调用呢?一般来说,我尽量避免模仿java的细节,如ArrayList、Date等。资源包(和MessageFormat.format())或多或少属于同一类。它们通常在基本的字符串上操作,如果这些东西被破坏了,或者改变了它们的行为,足以破坏测试,这肯定是我想知道的:)

只要让他们抓取字符串(可能将在UI中设置,可能在之后)。不要费心断言返回的值,因为您不希望对包的编辑破坏您的测试。如果字符串在模拟UI组件上设置,这是正确表达您(可能)的事实的任何对象(string.class)的好地方实际上并不关心显示的特定字符串

我也认为测试失败是因为缺少一个消息键。我想知道。

< p>使用EasyMoCK创建一个实例。相反,在使用静态方法时,必须模拟类(使用PosiMoCK)。

它的工作原理应该是这样的(尽管使用EasyMock 3.0和PowerMock 1.5进行了测试):

(我知道这个问题已经问了几个月了,但它可能会帮助其他人)

尝试使用:

@PrepareForTest({ResourceBundle.class, BeanBeingTested.class})
在PrepareForTest中只有ResourceBundle,当直接从单元测试方法调用时,mock可以工作,但是当从BeanBeingTested调用时,您可以使用实际的方法


Powermock文档在这方面是缺乏的。

我也面临同样的问题。但这仍然没有帮助。您是指最终方法还是静态方法?@Siddharth{{Powermock.mockStaticNice()}模拟一个类的一个静态方法,但保留其余方法不变。如果此线程对您没有帮助,您应该创建一个新问题,因为您似乎有不同的问题。感谢您的回复@Andy。但是此线程的主题讨论的是最终方法,而您讨论的是静态方法。我遗漏了什么吗?M问题是存在“公共最终无效”我正在尝试模拟的方法,测试调用的是实际方法而不是模拟方法。上面的问题与我正在讨论的问题不同吗?如果我遗漏了一些要点,很抱歉。PowerMock也适用于最终方法。我现在无法测试它,所以我可以为您指出正确的方向。我曾经遇到过PowerMock模拟问题Java内部构件的HOD(即{System.currentTimeMillis()}})-由于PowerMock的工作方式,它无法模拟它,所以我使用了jMockit,它的工作方式很有魅力,但使用起来却大不相同。
@PrepareForTest({ResourceBundle.class, BeanBeingTested.class})