2012-08-23 38 views
6

私は最終的なメソッドResourceBundle.getString()への呼び出しをモックしようとしています。 PowerMock 1.4.12およびEasyMock 3.1では、コールは侮られていません。代わりに、 "実際の"メソッドが呼び出されます。PowerMock + EasyMockで最終的な方法を模擬して

私のテストクラス:BeanBeingTestedで

@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); 
    } 
    ... 
} 

コード:

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"としてください。そうすれば、模擬が注入されます。corr間違いなく(また、セットアップ中にexpect()コール内のgetString()へのコールにエラーはありません)。平野モックの代わりに、素敵なモックで

、私は次のエラーを取得:

java.lang.AssertionError: 
    Unexpected method call handleGetObject("Queue"): 
    getString("Queue"): expected: 1, actual: 0 

任意のアイデアをどのような私が間違ってやっていますか?

ありがとうございました。

答えて

0

なぜリソースバンドルへの呼び出しを戸惑わせるのですか?一般的に、私はArrayList、DateなどJavaのナットとボルトを嘲笑しないようにしようとしています。リソースバンドル(とMessageFormat.format())は多かれ少なかれ同じカテゴリに分類されます。彼らは一般的には基本的な文字列で動作し、これらのことが壊れているか、テストを中断するのに十分な振る舞いをしているなら、私が知りたいことは間違いありません:)

ちょうどあなたのテストを中断するためにバンドルを編集したくないので返された値をアサートするのは面倒なことではありませんもし文字列がモックUIコンポーネントにセットされたら、これはanyObjectのための良い場所です

また、メッセージキーが見つからないためにテストが失敗した場合にも、これはメリットと考えられます。知っている。

3

EasyMockを使用してインスタンスを作成しています。代わりに、静的メソッドを使用する場合はクラスをモックする必要があります(PowerMockを使用)。

それは(ただし、EasyMock 3.0とPowerMock 1.5でテスト済み)そのように動作するはずです:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ResourceBundle.class) 
public class TestSuite { 
    @Before 
    public void setUp() throws Exception { 
     // mock the class for one method only 
     PowerMock.mockStaticNice(ResourceBundle.class, "getString"); 

     // define mock-behaviour on the class, when calling the static method 
     expect(ResourceBundle.getString(BundleConstants.QUEUE)).andReturn("Queue"); 

     // start the engine 
     PowerMock.replayAll(); 
    } 
} 

(私はこの質問は数ヶ月古いです承知しているが、それはしかし、他の人を助けるかもしれない)

+0

私も同じ問題に直面しています。しかしこれはまだ助けにはならない。あなたは最終的な方法のみ、または静的な方法を指していますか? – Siddharth

+0

@Siddharth {{PowerMock.mockStaticNice()}}はクラスの静的メソッドをモックしますが、残りのメソッドはそのままです。このスレッドが役に立たない場合は、新しい問題を作成する必要があります。異なる問題があるようだからです。 – Andy

+0

返信ありがとう@Andy。しかし、このスレッドのトピックは最終的な方法について話しますが、静的メソッドについて話しています。何か不足していますか? 私の問題は、模擬しようとしている "public final void"メソッドがあり、テストでは模擬メソッドではなく実際のメソッドが呼び出されているということです。上記の問題は、私が話している問題と異なっていますか?私はいくつかのポイントを逃した場合は申し訳ありません。 – Siddharth

1

使用してみてください:

@PrepareForTest({ResourceBundle.class, BeanBeingTested.class}) 

をPrepareForTestで唯一のResourceBundleでBeanBeingTestedあなたから呼び出されたときにモックは、あなたのユニットテストメソッドから直接呼び出すときに動作しますが、グラム実際の方法が使用されています。

Powermockのドキュメントはこの領域には欠けています。

関連する問題