2017-05-04 16 views
0

all-powerMock/PowerMockitoを使用して嘲笑しています。whenNewまたはexpectNewが実​​際のコンストラクタを呼び出していないときに黙って

ここでは、Spring用の新しいコンストラクタを呼び出すクラスを示します。

public class BaseService { 
     private void loadSpringConfig(String customResourceName) { 
      String[] resources = new String[1]; 
      resources[0] = "test.xml"; 
      context = new ClassPathXmlApplicationContext(resources); 
     } 
} 

ここで私が嘲笑に使用しているコードです。 weHnNewとexpectNewを使用すると、 'ClassPathXmlApplicationContext'コンストラクタが呼び出され、ファイルが見つからないという例外が発生します。 が新しい呼び出しを避ける:答えはとても単純なことができPowerMock暗黒の力...に

@RunWith(PowerMockRunner.class) 
@PrepareForTest({BaseService.class, 
    ClassPathXmlApplicationContext.class}) 
public class BaseServiceTest { 
    @Mock 
    ClassPathXmlApplicationContext ctx; 
    @Test 
    public void loadSpringConfigTest() throws Exception{ 

     //ClassPathXmlApplicationContext ctx = PowerMockito.mock(ClassPathXmlApplicationContext.class); 
     Method method; 
     String[] resources = new String[1]; 
     resources[0]="test.xml"; 
     BaseService bs = new BaseService(); 
     try { 
      method = BaseService.class.getDeclaredMethod("loadSpringConfig",String.class); 
      method.setAccessible(true); 
      //trowing exception of file not found - tried various option with no luck 
      PowerMockito.whenNew(ClassPathXmlApplicationContext.class).withAnyArguments().thenReturn(ctx); 
//Other tries 
//withParameterTypes(String[].class).withArguments(resources).thenReturn(ctx); 
      //PowerMock.expectNew(ClassPathXmlApplicationContext.class,new Class[]{String[].class},resources).andReturn(ctx); 
      method.invoke(bs,"test"); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
} 
+0

PowerMockのどのバージョンを使用していますか? –

+0

こんにちはAurthur、私はpowermock-core-1.6.2を使用しています。 –

+0

私の場合、すべての機能は見た目がよく、ただし、リフレクションを使用して呼び出されます。しかし、それは影響を与えるべきではありません。私は調査します。 –

答えて

-1

そんなに深いダイビング。

生産コードでnewを呼び出すことは、今日はが間違っています(多くの場合、必ずしもそうではありません)。今日です。コードをテストするのは、はるかに難しくなります。

したがって:

  • は簡単にテストコードを作成する方法を学びます。たとえば、newを呼び出す代わりにvideos
  • を参照して、依存性注入を使用して、そのようなコンテキストを取得するために使用できる簡単なファクトリをクラスに与えます。

いいえnew;あなたはそのような「黒い魔法」であなたのテストをすべて行うことができます。プラス:製品の品質も向上します。

あなたはすでに注射したいオブジェクトを模擬していますか?

@Mock 
ClassPathXmlApplicationContext ctx; 

嘲笑 ClassPath..Contextオブジェクトを作成します。たとえば、/を呼び出したときに経由するように設定する必要があるかもしれません。

+0

あなたの入力をありがとう。しかし、再び、注入されたオブジェクトを模擬する方法は? –

+0

更新情報を見る – GhostCat

+0

この回答は、人々が「常にではない」カテゴリーの間違った人に役立つわけではありません。 – taylorcressy

関連する問題