2016-08-27 5 views
2

Sonarquest 5.6.1をJava Plug-in 4.1で実行していて、SonarルールS2699(テストにアサーションが含まれている必要があります)を使用しています。中ソナールールS2699:すべてのアサートが有効なアサーションとして認識されない

import mypackage.Citit1543Dummy; 
import mypackage.Citit1543OtherDummy; 
import org.junit.Assert; 
import org.junit.Before; 
import org.junit.Test; 
import org.mockito.MockitoAnnotations; 

import java.util.Arrays; 

import static org.hamcrest.Matchers.is; 
import static org.hamcrest.Matchers.isIn; 
import static org.hamcrest.Matchers.lessThan; 
import static org.hamcrest.core.IsNot.not; 
import static org.mockito.Matchers.notNull; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.times; 
import static org.mockito.Mockito.verify; 
import static org.junit.Assert.assertThat; 

public class Citit1543Test { 

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

    @Test 
    public void test1() { 
     assert true; 
    } 

    @Test 
    public void test2() { 
     Assert.assertTrue(1 > (2-3)); 
    } 

    @Test 
    public void test3() { 
     Assert.assertFalse(1 > (100-1)); 
    } 

    @Test 
    public void test4() { 
     Assert.assertThat("test", 1, is(1)); 
    } 

    @Test 
    public void test5() { 
     Assert.assertArrayEquals(new String[0], new String[0]); 
    } 

    @Test 
    public void test6() { 
     Assert.assertEquals(1 > 0, true); 
    } 

    @Test 
    public void test7() { // asserts in another method 
     test7asserts(1, 1); 
    } 

    private void test7asserts(int a, int b) { 
     Assert.assertTrue(a == b); 
    } 

    @Test 
    public void test8() { 
     test8asserts(1, 2); 
    } 

    private void test8asserts(int a, int b) { 
     Assert.assertNotSame(a, b); 
    } 

    @Test 
    public void test9() { 
     Citit1543Dummy dummy = new Citit1543Dummy(); 
     dummy.otherDummy = mock(Citit1543OtherDummy.class); 
     dummy.doSomething(); 
     verify(dummy.otherDummy, times(1)).doSomething(); 
    } 

    @Test 
    public void test10() { 
     Citit1543Dummy dummy = new Citit1543Dummy(); 
     dummy.otherDummy = mock(Citit1543OtherDummy.class); 
     dummy.doSomething(); 
     test10verifies(dummy.otherDummy); 
    } 

    private void test10verifies(Citit1543OtherDummy otherDummy) { 
     verify(otherDummy, times(1)).doSomething(); 
    } 

    @Test 
    public void test11() { 
     Assert.assertThat("test", "", not(1)); 
    } 

    @Test 
    public void test12() { 
     Assert.assertThat("test", 1, lessThan(2)); 
    } 

    @Test 
    public void test13() { 
     Long[] arr = new Long[] { 1L, 2L, 3L, 4L }; 
     assertThat("Just testing", arr, is(new Long[] { 
      1L, 2L, 3L, 4L 
     })); 
    } 
} 

当社Sonarqubeインスタンスフラグテストケースtest1(認識されない文を主張)、test7(別の方法でステートメントをアサート)、test8(同)、test10(Mockitos verifyこの例のテストクラスを使用して

別の方法)、test11およびtest13をアサーションのないメソッドとして使用します。私は確かに認識されない多くのメソッドがあると確信しています(残念ながら、私たちはプロジェクト全体でさまざまな模擬/テストフレームワークを使用しています)。

今のところ、私たちはアサート/検証の1つが認識されないときは常に//NOSONARに始めました。 これらのメソッドを有効なアサートとして認識させる簡単な方法はありますか?

+0

test1フラグは間違いなく偽陽性ではありません。テストを実行するときに '-ea'を指定しないと、assertは無視されます。また、単体テストでのアサーションを検証するためのものでもありません。だから、バグを修正して無視しないでください。 –

答えて

4

あなたの記載された問題の多くは、FPとしてマークされていて実際には(別の形で)表示されています。 test1:現在のフロー解析ではアサート文が無視されます。グループでthis postを参照してください。

case7、test8、およびtest10は、相互手続き型分析がないことに関連しています。これらは有効なケースですが、現在のフローでは、別のメソッドの有効なassertステートメント。グループでthis postを参照してください。

他のケースでも、S2699のテストで誤検出が発生します。私は、SonarSourceの開発者がtest11/13のケースを解決するためのチケットを作成するという話題を読んだら、それを期待しています。しかし、私は彼らの開発者ではないので、私はもちろんそのことを保証することはできません。以下のよう

は有効なの表明として認識されるために必要なこれらのメソッドを含めるための簡単な方法はありますか?

いいえ、有効なアサーションはS2699のコード内で定義されており、パラメータではありません。いくつかのケースではより複雑なフロー解析が必要ですが、最後のカップルはいくつかの不足している定義や厳密な定義に沸騰しているようですが、FPを作成する理由については深く掘り下げませんでした。

+0

あなたの答えをありがとう。これがSonar Javaプラグインで修正されるまで待つ必要があるようです。 – ercpe

関連する問題