2017-01-20 9 views
1

これは、このoneの後続の質問です。モキトモッキングを防ぐ方法...動的に?

私の環境はJUnit、Mockitoの新しいバージョンにアップグレードしました...残念ながら、最新のIBM JREを使用してローカルテストを実行していました。

Mockitoこのクラスをモックすることはできません:インタフェースjava.utilのその後、我々は我々のビルド環境の中で、私たちのすべてのMockitoのテストは今

org.mockito.exceptions.base.MockitoExceptionで失敗していることが判明しました.concurrent.ExecutorService。

Mockitoは非公開のみをモックできます&非最終クラスです。 なぜこのエラーが発生するのかわからない場合は、メーリングリストに報告してください。続く

初期IBM仮想マシンがMockitoの問題を有することが知られている、最新のバージョンにアップグレードしてください。

OK;だから私はA)に時間を費やして、古いJREでテストを実行しているので、B)すべてのテストをスキップすることができました。最終的には;私は以下のコードをまとめました。

は、しかし、いくつかの注意事項が先行:私はSR1またはSR2レベルを持つIBM Java8 JREで実行しているときに私のforceJUnit...()方法が本当には、その例外をスローを検証しました。私のポイントは:メソッドがスローする必要があります...私はそのテストケースを実行するとき、私はまだ "モックできない"についてのMockito例外を打つ!

私がここで間違っているのは何ですか?

ここ
import static org.mockito.ArgumentMatchers.any; 
import static org.mockito.Mockito.doAnswer; 

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Future; 

import org.junit.Assume; 
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mock; 
import org.mockito.invocation.InvocationOnMock; 
import org.mockito.junit.MockitoJUnitRunner; 
import org.mockito.stubbing.Answer; 

class Helper { 
    public static void forceJUnitToIgnoreTestForJava8SR1() { 
     Assume.assumeFalse("Ignoring test when running with JRE SR1", isJava8SR1()); 
    } 

    private static boolean isJava8SR1() { 
     String fullVersion = System.getProperty("java.fullversion", ""); 
     return fullVersion.contains("R28_Java8_SR1"); 
    } 
} 

@RunWith(MockitoJUnitRunner.class) 
public class Mcve { 

    @Mock 
    private ExecutorService service; 

    @Before 
    public void setup() { 
     Helper.forceJUnitToIgnoreTestForJava8SR1(); 

     // make the mcve do something 
     doAnswer(new Answer<Future<?>>() { 
      @Override 
      public Future<?> answer(InvocationOnMock invocation) throws Throwable { 
       return null; 
      } 
     }).when(service).submit(any(Runnable.class)); 
    } 

    @Test 
    public void test() { 
     System.out.println("won't show up ;-("); 
    } 
} 

答えて

1

わからない、しかし:

  • たぶん、あなたはちょうどあなたがあなたのテストケースを変更し、@Mockアノテーションを削除することもできます@BeforeClass
  • か、でマークされたメソッド内Helper.forceJUnitToIgnoreTestForJava8SR1();を呼び出そう;セットアップ方法の中でHelper.forceJUnitToIgnoreTestForJava8SR1();を呼び出した後、必要なすべての設定手順を実行しますか?
+0

ああ、それは簡単だった...と正直に...誤る...まっすぐ進みます。 @BeforeClassを使ってもうまくいきます(もう1つのオプションはオプションではありませんでしたが、1つのmcveしか持っていませんが、この問題がある50以上のかなり複雑なテストケース)! – GhostCat

2

なく直接MockitoJUnitRunnerを使用してのMockitoAnnotations.initMocks(this)を呼び出す:

public class Mcve { 

    @Mock 
    private ExecutorService service; 

    @Before 
    public void setup() { 
     Helper.forceJUnitToIgnoreTestForJava8SR1(); 
     MockitoAnnotations.initMocks(this); 
     ... 
    } 

    @Test 
    public void test() { 
     System.out.println("won't show up ;-("); 
    } 
} 
+0

ニース、それも動作します!しかし、テストケース内で** 2つの異なる場所を更新するように強制します。もう一方のオプションは** insert **を必要とします。また、私はすでに必要な更新をすべて行っている途中です。それでもなお+1です。 – GhostCat

関連する問題