0

昨日は JUnit を学び、今日は Mockito を学びました

簡単なクラスを書きました。

public class FileOperations {
    public boolean autoMove(){
        List<byte[]> patterns = getListofPatterns();
        for(byte[] pattern: patterns){
            System.out.println(new String(pattern));
            if(seekInHeader(pattern)){
                //logic to move file of specific folder of specific extension
                return true;
            }
        }
        return false;
    }

    public boolean seekInHeader(byte[] pattern){
        return false;
    }
        
    public List<byte[]> getListofPatterns(){
        return null;
    }
}

そして、次のようにテストしようとしています

@Test
public void autoMoveTest(){
    FileOperations fo = mock(FileOperations.class);//stub
    List<byte[]> dummyPatterns = new ArrayList<byte[]>();//specify stub value
    dummyPatterns.add("amit".getBytes());
    
    when(fo.getListofPatterns()).thenReturn(dummyPatterns);
    when(fo.seekInHeader(anyString().getBytes())).thenReturn(true);
    
    System.out.println(new String(fo.getListofPatterns().get(0)));
    System.out.println(fo.seekInHeader("amit".getBytes()));
    System.out.println(fo.autoMove());
    assertTrue(fo.autoMove());
}

出力:

アミット

真実

間違い

seekHeader() が true を返すように設定しました。fo.autoMove() が false を返すのはなぜですか?

4

2 に答える 2

3

モックを使用すると、明示的に指定しない限り、どのメソッドも実際には何もしません。モックの要点は、機能がまったく置き換えられていない (デフォルト) か、スタブした機能によって置き換えられていることです。

モックのデフォルトの機能は、すべてのメソッドまったく何もせず、false(ブール値の場合)、ゼロ (数値プリミティブの場合)、空のコレクション、またはnull. したがって、この場合、別のことをするためにスタブしない限り、autoMove常に が返されます。false

モックを使用する全体的な考え方は、テストしようとしているクラスをモックしないことです。代わりに、相互作用する他のクラスをモックします。したがって、 class のメソッドが classのメソッドを呼び出し、 classをテストしたい場合。次に、 class のモックを使用し、呼び出されるメソッドをスタブします。ABABB

于 2012-09-25T04:43:30.013 に答える
1

次のようにスパイを使用してそれを行うことができます。

@Test
    public void autoMoveTest(){
        FileOperations fo = new  FileOperations("");
        FileOperations spyFo = spy(fo);

        List<byte[]> dummyPatterns = new ArrayList<byte[]>();//specify stub value
        dummyPatterns.add("amit".getBytes());

        when(spyFo.getListofPatterns()).thenReturn(dummyPatterns);
        when(spyFo.seekInHeader(anyString().getBytes())).thenReturn(true);//stubbing a method

        assertTrue(spyFo.autoMove());
    }

コードが失敗する理由

あなたがスタブしていなかったのでfo.autoMove()。モックオブジェクトを使用して実際のメソッドを呼び出すと、実際のメソッドは実行されません。return-typeまたはスタブ値のデフォルト値を返すだけです。したがって、trueからautoMove()戻ったとしても、モックオブジェクトに対してはfalseが返されます。

于 2012-09-27T01:19:38.620 に答える