2016-07-17 4 views
0

처음으로 단위 테스트를 작성하기에 앞서, 안드로이드 개발자 가이드를 읽었습니다. 내가 제대로 mMockContext.getApplicationInfo()안드로이드 유닛 테스팅

시험을 대체 아니에요 때문에 내가 내 테스트에 NullPointerException이 무엇입니까 그러나 그들은 문맥을 조롱 할 때 유사한 무언가를 달성하기 위해 시도하고 다음과 같습니다

package com.cinnamint.cotidiano; 


import android.app.Application; 
import android.content.Context; 
import android.content.pm.ApplicationInfo; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mock; 
import org.mockito.runners.MockitoJUnitRunner; 

import java.util.List; 

import static org.hamcrest.CoreMatchers.is; 
import static org.hamcrest.MatcherAssert.assertThat; 
import static org.junit.Assert.assertEquals; 
import static org.mockito.Mockito.when; 


@RunWith(MockitoJUnitRunner.class) 
public class MainUnitTest { 

    @Mock 
    Context mMockContext; 

    @Mock 
    ApplicationInfo mApplicationInfo; 

    @Test 
    public void dateValidator_CorrectNumberOfWordsGrab_ReturnWords() throws Exception { 

     when(mMockContext.getApplicationInfo()).thenReturn(mApplicationInfo); 

     WordDatabase testWordDatabase = new WordDatabase(mMockContext); 

     testWordDatabase.open(); 
     List<Words> results = testWordDatabase.getEveryWordByDate(4); 
     testWordDatabase.close(); 
     assertThat(results.size(), is(4)); 

    } 
} 

내가주의해야 데이터베이스가 SQLiteAssetHelper를 사용하고 있으며, 온라인 프로토콜이나 그 밖의 것을 통해 외부 데이터베이스에 액세스하지 못하도록합니다. 데이터베이스는 APK에 자산으로 저장되며 한 번만로드됩니다.

로그 캣 :

java.lang.NullPointerException 
    at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.<init>(SQLiteAssetHelper.java:109) 
    at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.<init>(SQLiteAssetHelper.java:129) 
    at com.cinnamint.cotidiano.WordDatabase.<init>(WordDatabase.java:20) 
    at com.cinnamint.cotidiano.MainUnitTest.dateValidator_CorrectNumberOfWordsGrab_ReturnWords(MainUnitTest.java:30) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37) 
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

편집 : 당신은 아마 ApplicationInfo 모의를 다시 제공해야 getApplicationInfo의 경우

com.readystatesoftware.sqliteasset.SQLiteAssetHelper$SQLiteAssetException 
    at java.io.FileOutputStream.open0(Native Method) 
    at java.io.FileOutputStream.open(FileOutputStream.java:270) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:101) 
    at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.copyDatabaseFromAssets(SQLiteAssetHelper.java:455) 
    at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.createOrOpenDatabase(SQLiteAssetHelper.java:400) 
    at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:176) 
    at com.cinnamint.cotidiano.MainUnitTest.dateValidator_CorrectNumberOfWordsGrab_ReturnWords(MainUnitTest.java:88) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37) 
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

답변

1

: 테스트

@Test 
public void dateValidator_CorrectNumberOfWordsGrab_ReturnWords() throws Exception { 

    when(mMockContext.getApplicationInfo()).thenReturn(mApplicationInfo); 
    when(mMockContext.getAssets()).thenReturn(mAssetManager); 
    when(mAssetManager.open("null/databases/word.db")).thenReturn(mInputStream); 

    WordDatabase testWordDatabase = new WordDatabase(mMockContext); 

    when(testWordDatabase.getWritableDatabase()).thenReturn(mSQLiteDatabase); 

    testWordDatabase.open(); 
    List<Words> results = testWordDatabase.getEveryWordByDate(4); 
    testWordDatabase.close(); 
    assertThat(results.size(), is(4)); 

} 

새로운 스택 트레이스의 새로운 버전. 거짓말 :

클래스를 테스트 할 때 시나리오를 작성하고 주어진 시나리오에 대한 모의문을 설정합니다.

+0

감사합니다. 언제 (mMockContext.getApplicationInfo()). thenReturn (mApplicationInfo);를 추가했지만 동일한 logcat으로 테스트를 통과하지 못했습니다. mApplication Info로 계속 놀려고 노력할 것입니다. –

+0

다른 호출이있을 수 있습니다. 모두 조롱해야합니다. – jbarat

+0

그래, 내가 NPE를 실행할 때마다 더 많은 mock을 추가했다. 제 3 자 라이브러리'SQLiteAssetHelper'를 사용하고 있기 때문에 엄청난 문제가되는 것 같습니다. 그것은 정상적인 테스트입니까? 저는 5 개의 객체를 조롱했습니다. 그리고 데이터베이스 경로 문자열이 필요한 곳에 예외가 생겨서 모방하는 법을 모릅니다. 내 시험을 재구성하여 내가 원하는 것을 성취 할 수있는 더 좋은 방법이 있습니까? 아니면 이것을 테스트하지 않는 것이 좋습니까? –