13

私はこのようなクラスを持っています:

public final class Foo
{
    public native int getBar();

    public String toString()
    {
        return "Bar: " + getBar();
    }
}

getBar()は JNI で実装され、クラスはfinalであることに注意してください。toString()メソッドをテストする JUnit テストを作成したいと考えています。このためには、getBar()メソッドをモックしてから、元のtoString()メソッドを実行して出力を確認する必要があります。

最初はこれは不可能だろうと思っていましたが、機能リストに従って最終クラスとネイティブ メソッドのテストをサポートするPowerMockを見つけました。しかし、これまでのところ、私はそれで成功していません。私が管理した最善のことは、完全なクラスをモックすることでしたが、テストでは、あまり意味のない実際のメソッドではなく、モックされたtoString()メソッドをテストしました。

では、PowerMock を使用して上記のtoString()メソッドをテストするにはどうすればよいでしょうか? 私は Mockito でPowerMockを使用することを好みますが、これが不可能な場合は、代わりにEasyMockを使用しても問題ありません。

4

3 に答える 3

9

それを見つけた。私のやり方は正しかった。私が見逃していたのは、toString が呼び出されたときに元のメソッドを呼び出すようにモック オブジェクトに指示したことだけでした。したがって、次のように機能します。

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Foo.class })
public class FooTest
{
    @Test
    public void testToString() throws Exception
    {
        Foo foo = mock(Foo.class);
        when(foo.getBar()).thenReturn(42);
        when(foo.toString()).thenCallRealMethod();
        assertEquals("Bar: 42", foo.toString());
    }
}
于 2011-02-06T22:04:38.457 に答える
3

または動的部分モッキングでJMockitを使用します。

import org.junit.*;
import mockit.*;

public class FooTest
{
    @Test
    public void testToString()
    {
        final Foo foo = new Foo();
        new Expectations(foo) {{ foo.getBar(); result = 42; }};

        assertEquals("Bar: 42", foo.toString());
    }
}
于 2011-02-11T15:16:04.933 に答える
1

または戦略パターンを使用します:

    public final class Foo
    {
        public IBarStrategy barStrategy;

        ......
    }

    interface IBarStrategy{
        int getBar();
    }

単体テスト時にモックIBarStrategyインスタンスを注入すると、クラスをテストできますFoo

于 2011-02-07T04:31:10.303 に答える