2017-01-06 3 views
1

В настоящее время я начинаю тестировать приложение для Android. У меня возникают проблемы, когда код проверки работоспособности модуля содержит в нем записи журнала. Вот конкретный случай. У меня есть класс, называемый ServiceManager, который имеет метод setSystemPause() и getSystemPause(). Я просто хочу простой тест модуля, который осуществлять эту логикуЗаявление о регистрации во время модульного теста

ServiceManager класс:

public class ServiceManager implements IServiceManager { 

    private final static String TAG = "ServiceManager"; 

    private boolean mSystemPauseStatus = false; 

    public boolean getSystemPause() { 
     Log.i ("TAG", "getSystemPause: " + mSystemPauseStatus); 
     return mSystemPauseStatus; 
    } 

    public void setSystemPause (boolean pauseStatus){ 
     Log.i ("TAG", "setSystemPause: " + pauseStatus); 
     mSystemPauseStatus = pauseStatus; 
    } 
} 

испытательной установки:

public class ServiceManagerTest { 

    @Test 
    public void testSystemPause() throws Exception { 
     ServiceManager serviceManager = new ServiceManager(); 

     serviceManager.setSystemPause(false); 
     assert (! serviceManager.getSystemPause()); 

     serviceManager.setSystemPause(true); 
     assert (serviceManager.getSystemPause()); 
    } 
} 

Проблема являются «Log.i» заявления в моем коде. Это приводит следующее сообщение об ошибке:

java.lang.RuntimeException: Method i in android.util.Log not mocked. 

Я понимаю, что происходит, во время блока тестирования android.jar библиотеки, которая используется не содержит реального кода, и мне нужно, чтобы дразнить этот призыв к «Log.i».

Но база кода, которую я собираюсь протестировать, содержит множество операторов журнала. Я не хочу издеваться над каждым использованием средства журнала.

Мой вопрос в том, как люди проводят модульное тестирование в Android, имея в своем коде логические операторы. Есть ли другой журнал, который я могу использовать в своем коде вместо класса журнала.

Я также прочитал страницу здесь: https://developer.android.com/training/testing/unit-testing/local-unit-tests.html

Они предлагают делать это в моем build.gradle файле:

android { 
    ... 
    testOptions { 
    unitTests.returnDefaultValues = true 
    } 
} 

Я не хочу прибегать к этому, потому что я просто хочу Вход появиться. Я хочу правильно высмеять все другие объекты, которые я буду использовать в Android.

ответ

0

Но будет ли заявление журнала влиять на результаты ваших модульных тестов? Проблема в том, что Log является Android-специфическим классом и не может использоваться как часть теста JUnit 4, поскольку он не является частью Java JDK. Если вам нужно, чтобы операторы Log работали по назначению, либо издевайтесь над поведением с помощью Mockito, либо используйте returnDefaultValues = true, либо запустите тест как папку (/androidTest вместо /test).

Я лично использую returnDefaultValues = true, поскольку вы упоминаете, как Logging - это то, что меня обычно не интересует, когда Unit Testing, только когда я пытаюсь отследить конкретные ошибки.

0

Вы можете создать уровень пакета метод в ServiceManager класс, который вызывает Log.i метод.

public class ServiceManager implements IServiceManager { 

private final static String TAG = "ServiceManager"; 

private boolean mSystemPauseStatus = false; 

public boolean getSystemPause() { 
    log("TAG", "getSystemPause: " + pauseStmSystemPauseStatusatus); 
    return mSystemPauseStatus; 
} 

public void setSystemPause (boolean pauseStatus){ 
    log("TAG", "setSystemPause: " + pauseStatus); 
    mSystemPauseStatus = pauseStatus; 
} 

void log(String tag, String message) { 
    Log.i (tag, message); 
} 

Затем вы можете переопределить этот метод в ServiceManagerTest не дают никакой реализации.

public class ServiceManagerTest { 

@Test 
public void testSystemPause() throws Exception { 
    ServiceManager serviceManager = createServiceManager(); 

    serviceManager.setSystemPause(false); 
    assert (! serviceManager.getSystemPause()); 

    serviceManager.setSystemPause(true); 
    assert (serviceManager.getSystemPause()); 
} 

private ServiceManager createServiceManager() { 
    return new ServiceManager() { 
    @Override 
    void log(String tag, String message) { 
     //Do nothing or you could test that this method was called. 
    } 
    } 
} 
} 
Смежные вопросы