6

私はMockitoとPowerMockitoも初めてです。純粋な Mockito では静的メソッドをテストできないことがわかったので、PowerMockito を使用する必要があります (そうですか?)。

この非常に簡単な方法で Validate という非常に単純なクラスがあります

public class Validate {
        public final static void stateNotNull(
            final Object object,
            final String message) {
    if (message == null) {
        throw new IllegalArgumentException("Exception message is a null object!");
    }
    if (object == null) {
        throw new IllegalStateException(message);
    }
}

したがって、次のことを確認する必要があります。

1) null メッセージ引数でその静的メソッドを呼び出すと、IllegalArgumentException が呼び出されます
2) null オブジェクト引数でその静的メソッドを呼び出すと、IllegalStateException が呼び出されます

これまでに得たものから、このテストを書きました:

import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.isNull;

import org.junit.Before;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.testng.annotations.Test;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Validate.class)
public class ValidateTestCase {

    @Test(expectedExceptions = { IllegalStateException.class })
    public void stateNotNullTest() throws Exception {
        PowerMockito.mockStatic(Validate.class);
        Validate mock = PowerMockito.mock(Validate.class);
        PowerMockito.doThrow(new IllegalStateException())
            .when(mock)
            .stateNotNull(isNull(), anyString());
        Validate.stateNotNull(null, null);
    }
}

したがって、これは Validate クラスをモックし、そのメソッドで null 引数をオブジェクトとして、任意の文字列をメッセージとしてモックが呼び出されると、IllegalStateException がスローされることを確認しています。

今、私は本当にそれを理解していません。そのメソッドを直接呼び出すことができないのはなぜですか? とにかく Validate.stateNotNull を呼び出さない限り、テストに合格するように思えます...どのような理由でそれをモックする必要がありますか?

4

2 に答える 2

11

テストしているクラスとメソッドをモックしないでください。テスト自体を実行するために必要なメソッドのみをモックする必要があります。

たとえば、テストを実行するために Web サービスからいくつかのオブジェクトが必要な場合、Web サービス呼び出しをモックすることができるため、実際に Web サービスを呼び出す必要はありません。

于 2013-03-01T14:45:02.567 に答える
8

まず、目的とテスト対象を決定します。Fortega が指摘しているように、テストは Validate クラス メソッドをテストするのではなく、そのメソッドのように動作するモックを作成しています。何をテストしているか (テスト対象のオブジェクト) と、テストを実行するために何が必要か (共同作業者) を特定し、共同作業者を見て、それらが簡単に作成できるものかどうか、または必要かどうかを判断します。それらを嘲笑します。

このクラスのように何にも依存しないものについては、完全にモックなしで行うことをお勧めします。ここにはモックが必要なものは何もありません。テストは次のように記述できます。

import static org.junit.Assert.*;

public class ValidateTestCase {

    @Test
    public void testHappyPath() throws Exception {
        Validate.stateNotNull("", "");
    }

    @Test
    public void testNullMessage() throws Exception {
        try {
            Validate.stateNotNull(null, null);
            fail();
        }
        catch (IllegalStateException e) {
            String expected = "Exception message is a null object!"
            assertEquals(expected, e.getMessage());
        }
    }

    @Test(expected=IllegalStateException.class)
    public void testNullObject() throws Exception {
        Validate.stateNotNull(null, "test");
    }
}

これにより、コードが目的どおりに動作するかどうかがわかります。

外部リソース (ファイルシステムやデータベースなど) または複雑なサブシステムであるために、テストへの導入を避けたい依存関係がない限り、モックしないでください。モック フレームワークは非常に便利ですが、複雑さが増し、テスト対象の動作を過度に指定してテストが脆弱になり、テストが読みにくくなる可能性があります。できればそれらなしでやってください。

于 2013-03-01T14:55:35.713 に答える