4

アプリケーションをユニットテストするためにMockitoを学ぶのに苦労しています。以下は、現在テストしようとしているメソッドの例です。

public boolean validateFormula(String formula) {

    boolean validFormula = true;
    double result = 0;

    try {
        result = methodThatCalculatAFormula(formula, 10, 10);
    } catch (Exception e) {
        validFormula = false;
    }

    if (result == 0)
        validFormula = false;
    return validFormula;
}

このメソッドは、同じクラスの別のメソッドを呼び出します。methodThatCalculatAFormulaこれは、単体テストのときに呼び出したくありませんvalidateFormula

これをテストするために、何が返されるかに応じてこのメソッドがどのように動作するかを確認したいと思いmethodThatCalculatAFormulaます。falseが0の場合に返されresult、0以外の数値の場合は有効が返されるため、実際のメソッドを実行せずにこれらの戻り値をシミュレートしたいと思いmethodThatCalculatAFormulaます。

私は次のように書いています:

public class FormlaServiceImplTest {
    @Mock
FormulaService formulaService;

@Before
public void beforeTest() {
   MockitoAnnotations.initMocks(this);
}

@Test
public void testValidateFormula() {                 

`//Valid since methodThatCalculatAFormula returns 3`    
when(formulaService.methodThatCalculatAFormula(anyString(),anyDouble(),anyDouble(),anyBoolean())).thenReturn((double)3);        
        assertTrue(formulaService.validateFormula("Valid"));    



//Not valid since methodThatCalculatAFormula returns 0
when(formulaService.methodThatCalculatAFormula(anyString(),anyDouble(),anyDouble(),anyBoolean())).thenReturn((double)0);
    assertFalse(formulaService.validateFormula("Not Valid"));
}

ただし、上記のコードを実行すると、assertTruefalseです。模擬設定で何か間違ったことをしたと思います。methodThatCalculatAFormula実際に呼び出さずにの戻り値をシミュレートして、上記のメソッドをどのようにテストしますか。

4

2 に答える 2

4

あなたがやろうとしているのは、モックではなくスパイ(部分的なモック)です。オブジェクトをモックするのではなく、1つのメソッドだけをモックする必要があります。

これは機能します:

public class FormulaService {
    public boolean validateFormula(String formula) {

        boolean validFormula = true;
        double result = 0;

        try {
            result = methodThatCalculatAFormula(formula, 10, 10);
        } catch (Exception e) {
            validFormula = false;
        }

        if (result == 0)
            validFormula = false;
        return validFormula;
    }

    public  double methodThatCalculatAFormula(String formula, int i, int j){
        return 0;
    }
}

public class FormulaServiceImplTest {

    FormulaService formulaService;

    @Test
    public void testValidateFormula() {

        formulaService = spy(new FormulaService());
        // Valid since methodThatCalculatAFormula returns 3`
        doReturn((double) 3).when(
                formulaService).methodThatCalculatAFormula(anyString(),
                        anyInt(), anyInt());
        assertTrue(formulaService.validateFormula("Valid"));

        // Not valid since methodThatCalculatAFormula returns 0
        doReturn((double)0).when(
                formulaService).methodThatCalculatAFormula(anyString(),
                        anyInt(), anyInt());
        assertFalse(formulaService.validateFormula("Not Valid"));
    }
}

ただし、スパイは使用しないでください。クラスを2つにリファクタリングして、一方を他方のモックに対してテストできるようにする必要があります。

于 2013-03-13T16:21:26.187 に答える
0

モッククラスでコードをテストすることはできません。モックするだけで、すべてのメソッドがスタブになります。

代わりにスパイする必要があります。Spyの使用方法に関するMockitoのドキュメントをお読みください。

于 2013-03-13T16:16:46.943 に答える