5

私は最近 JMockit を使い始めましたが、TDD とモッキングは初めてです。特定のクラス/メソッドのすべての行をテストしたことを確認するために、コード カバレッジを使用するのが好きです。

JMockit (Delegate() 機能) とコード カバレッジを試しているときに、次のエラーが発生しました。合格と不合格の両方のテストを含めています。

何か間違ったことをしているのかどうかわかりませんか?

他の誰かがこの問題に遭遇したかどうか、また利用可能な回避策や修正があるかどうかを知りたいです。

これが JMockit の問題なのか EclEmma の問題なのかさえわかりません。ありがとう。

私のセットアップ:

  • OS:WindowsXP
  • JDK-JRE: 1.7.0
  • JUnit: 4.11
  • Jモキット: 1.3
  • EclEmma: 2.2.1.201306092145
  • 日食: 3.6

失敗のトレース:

java.lang.IllegalArgumentException: 互換性のあるメソッドが見つかりません: getType(java.lang.Integer) at com.ps.jmockit.samples.DelegateCoverageTest$Dog.getAnimalType(DelegateCoverageTest.java:99) at com.ps.jmockit.samples.DelegateCoverageTest .coverageFails(DelegateCoverageTest.java:71)、sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブ メソッド)、java.lang.reflect.Method.invoke(Method.java:601)、sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブ メソッド) java.lang.reflect.Method.invoke(Method.java:601) で org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) で org.eclipse.jdt.internal.junit で.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) の runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.メイン (RemoteTestRunner.java:197)


コード: (coverageFails() を EclEmma と一緒に使用すると、上記のエラーが表示されます)

package com.ps.jmockit.samples;

import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;

import mockit.Delegate;
import mockit.Expectations;
import mockit.Mocked;

import org.junit.Test;

/**
 *  As of 7/25/2013, if I try to run the EclEmma coverage tool, it fails for {@link #coverageFails()}
 */
public class DelegateCoverageTest
{

    @Mocked
    Animal  fakeAnimal;

    @Test
    public void coverageWorks()
    {
        final String fake = "Fake";

        new Expectations()
        {
            {
                DelegateCoverageTest.this.fakeAnimal.getType(1);
                result = fake;
            }
        };

        //Arrange
        final Dog dog = new Dog();

        // Act
        final String animalType = dog.getAnimalType(this.fakeAnimal);

        // Assert
        assertThat(animalType, is(fake));
    }

    @Test
    public void coverageFails()
    {
        final String one = "One";
        final String two = "Two";

        new Expectations()
        {
            {
                DelegateCoverageTest.this.fakeAnimal.getType(anyInt);
                result = new Delegate()
                {
                    @SuppressWarnings("unused")
                    String aDelegateMethod( final int input )
                    {
                        return input == 1
                                ? one
                                : two;
                    }
                };
            }
        };

        //Arrange
        final Dog dog = new Dog();

        // Act
        final String animalType = dog.getAnimalType(this.fakeAnimal);

        // Assert
        assertThat(animalType, is(one));
    }


    //----------------- SUPPORTING CLASSES -----------------//

    interface Animal
    {
        String getType(int input);
    }

    class Mammal implements Animal
    {
        @Override
        public String getType(final int input)
        {
            return "Mammal";
        }
    }

    class Dog
    {

        public String getAnimalType(final Animal animal)
        {
            return animal.getType(1);
        }
    }

}
4

1 に答える 1