2014-08-14 6 views
1

Возможно ли контролировать значение глобальной переменной в тестируемом классе? Глобальная переменная используется в частном методе, поэтому я использую общедоступный метод (в том же классе), чтобы пройти через него.Как управлять глобальной переменной в unitTest

Как я могу сказать, что mListValService != null?

public class Myclass { 

    //my global variable 
    private ListValServiceRemote listValService = null; 

    public String getCodeValeurRef(Long idValeur) { 
    return getListValService().getRlvCode(idValeur); 

    // I want 100% coverage on this method so i have to change the value 
    // of mListValService. 
    private ListValServiceRemote getListValService() { 
     if (listValService == null) { 
     listValService = ServiceGetter.getListValService(); 
     } 
     return listValService; 
    } 
+2

Почему вы говорите, что это глобально? Вы пропустили 'static' из кода, отрезанного? – kan

ответ

0

ReflectionTestUtils от spring-test может быть решением для доступа к значению поля. Вы также можете использовать обычное старое отражение, добавить геттер/сеттер в поле или создать поле protected и поставить тест в том же пакете, что и тестируемый класс.

испытания образца:

public class MyclassTest { 
    private MyClass myClass; 

    @Before 
    public void setup() { 
     this.myClass = new MyClass(); 
    } 

    @Test 
    public void testGetListValServiceWhenFieldIsNull() { 
     assertNotNull(this.myClass.getListValService()); 
    } 

    @Test 
    public void testGetListValServiceWhenFieldIsNotNull() { 
     final ListValServiceRemote lvsr = new ListValServiceRemote(); 
     ReflectionTestUtils.setField(this.myClass, "listValService", lvsr); 
     assertSame(lvsr, this.myClass.getListValService()); 
    } 
} 
+0

спасибо большое, он работает просто отлично :) – Darlene

1

Вы можете выставить метод getListValService(), как пакет-частное, а затем вызвать его в тесте. Вы можете подтвердить, что одно и то же значение возвращается каждый раз:

@Test 
public void sameListValTest() { 
    Myclass foo = // construct this somewhow 

    assertTrue(foo.getListValService() == foo.getListValService()); 
} 

Это даст вам 100% -ное покрытие, не пускаясь в частное поле.

Или вы можете просто позвонить getCodeValeurRef() дважды в свой тест для достижения тех же результатов. Все, что вызывает выполнение getListValService(), даст вам 100% -ый охват. Выставляя его как private-package, вы можете проверить, что вы повторно используете одно и то же поле, не создавая его каждый раз (если это важно).

+0

Это плохой знак, если вам нужно выставить некоторых членов только для модульного тестирования. – kan

+0

@kan В целом я согласен. Есть исключения, и трудно определить, является ли это одним, исходя из того, что мы знаем до сих пор. –

1

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

Во-вторых, частный частный, не проверяйте его. Ваш код должен быть протестирован и рассмотрен только с использованием общедоступных методов. Если какой-либо код недоступен через открытый интерфейс, то он недоступен вообще. Почему вы хотите проверить это?

Этот конкретный код может быть легко покрыт 100%, если вы просто дважды вызываете getCodeValeurRef(). А также, если у вас будет listValService == null, это приведет к тому, что NullPointerException не сможет выполнить тест, так что утверждение не требуется.

+0

+1 Хороший вопрос о [IoC] (http://en.wikipedia.org/wiki/Inversion_of_control). –