2012-09-14 8 views
5

メソッドが呼び出されたかどうかを確認する必要のあるユニットテストを作成しようとしています。私はJUnit、Mockito、PowerMockを使用しています。テスト中のシステム(メソッドではない)でメソッドが呼び出されているかどうかを確認する方法

 
public class Invoice 
{ 

    protected void createInvoice() 
    { 
    // random stuff here 
    markInvoiceAsBilled("57"); 
    } 

    protected void markInvoiceAsBilled(String code) 
    { 
    // marked as billed 
    } 
} 

ここで、私のシステムは、Invoiceです。私はこのテストを実行している:

 
    public class InvoiceTest 
    { 
    @Test 
    public void testInvoiceMarkedAsBilled() 
    { 
     Invoice sut = new Invoice(); 
     Invoice sutSpy = spy(sut); 

     sut.createInvoice(); 

     // I want to verify that markInvoiceAsBilled() was called 
    } 
    } 

この例では、実際のコードがどのように見えるかのほんの一例です....

を私の問題は、mockitoは、メソッドが呼び出された場合にのみ、検証できると言うことです嘲笑されたオブジェクトに...しかし、私はこのオブジェクトを模擬したくない、それはテスト対象のオブジェクトだからです。私はあなたがテストしているオブジェクトをスパイすることができます知っているので、ここで私が試したものです:

 

    verify(sutSpy).markInvoiceAsBilled("57"); 

が、私は可能ではないが何をしようとしていますか?それとも間違った方向に進むのですか?

おかげでみんな:)

答えて

5

私はあなたが何しようとしていることは、物事に取り掛かるための最善の方法であるかはわかりません。

私はInvoice.createInvoice()は内部、プライベートメソッドmarkInvoiceAsBilled()呼び出すことを確認することで自分に関係ないだろう - statusは今BILLEDまたは類似のものであること、すなわち - 代わりcreateInvoice()を呼び出すと、あなたが期待するように、請求書オブジェクトの状態を変更することをテスト。言い換えれば

- このメソッドを呼び出した後、オブジェクトの状態は、あなたが期待するものであることをテスト - メソッドはcreateInvoice()で呼ばれているものをテストしていません。

0

私はmatt-bの答えに同意します。つまり、ユースケースとメソッドの複雑さに応じて、ユニットを再設計してテストすることができます。

たとえば、オブジェクトがはるかに複雑になるとします。テストとテストとCとBをカバー

public A { 
    public a() { 
    b(); 
    c(); 
    } 

    public b() { /** hairy code, many branches to test */ } 
    public c() { /** hairy code, many branches to test */ } 
} 

はストレートフォワードですが、方法BとCに依存するためカバーすることは面倒のように思われます。

考えてみましょう代わりにこの設計

public A { 
    private final Dep mDep; 

    public a() { 
    mDep.b(); 
    mDep.c(); 
    } 

    public b() { 
    mDep.b(); 
    } 

    public c() { 
    mDep.c(); 
    } 

    // dependency abstraction we create to help test 
    static class Dep { 
    public b() { /** hairy code, many branches to test */ } 
    public c() { /** hairy code, many branches to test */ } 
    } 
} 

は今、A.aA.bA.cをテストするだけで、あなたのmDepは(方法はありません任意の他の間で)と呼ばされていることを確認する必要があります。これとは別に、A.Dep.bA.Dep.cメソッドをテストします。

関連する問題