2016-09-06 12 views
2

私はユニットスタジオとモックを始めたので、Android Studioでの継続的な統合を設定するように求められました。模擬メソッドが実際の値を返す

私はモキト基盤と仕事を忘れてしまったと感じます。これは私のコードである

@RunWith(MockitoJUnitRunner.class) 
    public class ExampleUnitTest { 

     MainActivity classToTest = new MainActivity(); 

     @Mock 
     ClassIDontWantToTest classToMock; 

     /** 
     * Examples found a lot of times on the Internet 
     * My method is not tested at all 
     * I think it doesn't make sense to test Mockito but our own methods 
     * @throws Exception 
     */ 
     @Test 
     public void testMethodIDontWantToTest() throws Exception { 
     when(classToMock.methodIDontWantToTest()).thenReturn("Mocked result"); 
     assertTrue(classToMock.methodIDontWantToTest().equals("Mocked result")); 
     } 

    } 

:私は、インターネット上の例のこの種を見つけた

public class MainActivity extends AppCompatActivity { 
     ClassIDontWantToTest classIWantToMock = new ClassIDontWantToTest(); 

     /** 
     * Actual Method I want to test 
     * @return Return value 
     */ 
     public String methodIWantToTestButReturnsUnspectedValue() { 

      // (...) Code to test 

      return classIWantToMock.methodIDontWantToTest(); 
     } 
    } 


    public class ClassIDontWantToTest { 

     public String methodIDontWantToTest() { 
     return "Actual result"; 
     } 

    } 

そしてこれは、私はそれを行う必要があります理解する方法です:

@RunWith(MockitoJUnitRunner.class) 
    public class ExampleUnitTest { 
     MainActivity classToTest = new MainActivity(); 

     @Mock 
     ClassIDontWantToTest classToMock; 

     /** 
     * Test I want to do and I think it makes sense, but it doesn't work 
     * @throws Exception 
     */ 
     @Test 
     public void testMethodIWantToTest() throws Exception { 
     when(classToMock.methodIDontWantToTest()).thenReturn("Mocked result"); 
     assertTrue(classToTest.methodIWantToTestButReturnsUnspectedValue().equals("Mocked result")); 
     } 
    } 

明らかに私は理解できないことがありますが、私はそれが何であるか分かりません。 誰かが私が間違っている場所を教えてもらえますか?

ありがとうございました!

@RunWith(MockitoJUnitRunner.class) 
public class ExampleUnitTest { 

    @InjectMocks 
    MainActivity classToTest; 

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

    @Mock 
    ClassIDontWantToTest classToMock; 

    @Test 
    public void testMethodIWantToTest() throws Exception { 
    when(classToMock.methodIDontWantToTest()).thenReturn("Mocked result"); 
    String expected = classToTest.methodIWantToTestButReturnsUnspectedValue(); 
    assertEquals(expected, "Mocked result"); 
    } 
} 
+0

ユニットテスト(JVM)または計測テスト(エミュレータ)ですか?また、 'ClassIDontWantToTest'と' methodIDontWantToTest'は共に公開されており、最終的なものではありません。 –

+0

私が見る限りでは、テストしているクラスにモックオブジェクトを注入していません。これにアプローチする私の好みの方法は、テストするクラスに2番目のコンストラクタを追加し、 'classIWantToMock'の値を渡してから、この2番目のコンストラクタでインスタンス化されたオブジェクトをテストすることです。 2番目のコンストラクタをクラスに追加できない場合、もう1つのアプローチは、@InjectMocksアノテーションをテストの 'classToTest'宣言に置くことですが、それは時にはより淡いこともあります。 –

答えて

0

あなたのモックオブジェクトは、あなたのMainActivity classToTest = new MainActivity();クラスを使用すると、このようなものが必要であることを行うためにClassIDontWantToTest classToMock;

を注入していないことを意味し、正しく設定されていません! David Wallace氏によると、classToTestの宣言に@InjectMocksという注釈を付ける必要がありました。

今、私のテストはうまくいきますし、意味があります。どうもありがとうございました!

@RunWith(MockitoJUnitRunner.class) 
public class ExampleUnitTest { 

    @Mock 
    ClassIDontWantToTest classToMock; 

    @InjectMocks 
    MainActivity classToTest; 

    ////////// Test that makes sense and works fine 
    @Test 
    public void testMethodIWantToTest() throws Exception { 
    when(classToMock.methodIDontWantToTest()).thenReturn("Mocked result"); 
    assertTrue(classToTest.methodIWantToTest().equals("Mocked result")); 
    } 

} 



//////////////// Class to mock 
public class ClassIDontWantToTest { 
    public String methodIDontWantToTest() { 
    return "Actual result"; 
    } 
} 




////////////// Class to be tested 
public class MainActivity extends AppCompatActivity { 
    ClassIDontWantToTest classIWantToMock = new ClassIDontWantToTest(); 

    //////////// Actual Method I want to test 
    public String methodIWantToTest() { 
     // (...) Code to test 
     return classIWantToMock.methodIDontWantToTest(); 
    } 

} 
0

ユーレカ:

+0

あなたはこの回答を「受け入れられた」(またはkuhajeyanのもの、これは基本的に同じです)とマークする必要があります。 –

関連する問題