Создать смоделированный список с объектами - PullRequest
0 голосов
/ 20 октября 2019

Я хочу создать тест JUnit с проверенными объектами:

public class BinCountryCheckFilterImplTest {

    private RiskFilterService riskFilterService = null;

    @Before
    public void beforeEachTest() {

        List<RiskFilters> list = new ArrayList<RiskFilters>();

        riskFilterService = Mockito.mock(RiskFilterService.class);

        // put here list of List<RiskFilters> and return it 
    }

    @Test
    public void testBinCountryCheckFilterImpl() {

        List<RiskFilters> filter_list = riskFilterService.findRiskFiltersByTerminalIdAndType(11, "test");
         // do something                
    }    
}

Как я могу вернуть список List<RiskFilters>, если RiskFilterService вызывается?

Вторая попытка:

public class BinCountryCheckFilterImplTest {

    private RiskFilterService riskFilterService = null;

    @Mock
    List<RiskFilters> mockList = new ArrayList<RiskFilters>();

    @BeforeClass
    public void beforeEachTest() {

        //if we don't call below, we will get NullPointerException
        MockitoAnnotations.initMocks(this);

        mockList.add(new RiskFilters());

        riskFilterService = Mockito.mock(RiskFilterService.class);
    }

    @Test
    public void testBinCountryCheckFilterImpl() {

        when(riskFilterService.findRiskFiltersByTerminalIdAndType(anyInt(), anyString())).thenReturn(mockList);

        List<RiskFilters> filter_list = riskFilterService.findRiskFiltersByTerminalIdAndType(11, "BinCountryCheckFilter");

    }
}

Но я получаю NPE за riskFilterService. Похоже, что метод с аннотацией @test вызывается до @ BeforeClass.

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Когда в модульном тесте требуется Список или любая другая Коллекция, первый вопрос, который нужно задать себе: я должен создать для него макет или создать Список или Коллекцию, содержащую макеты.

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

В противном случае обычно лучше не издеваться над списком или коллекцией, а создать нормальный, содержащий ложныеобъекты, потому что может быть очень трудно узнать, какие методы Списка или Коллекций должны быть заглушки. Какие методы вызываются при использовании цикла for для итерации элементов, при использовании итератора для них, при использовании потока для них, ...? Я часто использую Collections.singletonList или Arrays.asList с фиктивными параметрами для инициализации списков при написании модульных тестов.

Я вижу, что вы насмехаетесь над списком, а затем вызываете метод add, чтобы добавить в него данные при настройкеконтрольная работа. Не имеет смысла добавлять данные в макетированный список. Вы можете использовать Mockito.when, чтобы вернуть его, когда он должен быть возвращен, но тогда у вас возникнут проблемы, потому что вам может понадобиться заглушить больше методов, и будет сложно узнать, какие из них (isEmpty, size, ...). То, что вы добавляете объект data в список, вероятно, означает, что тестируемый метод не просто передает список, а получает доступ к данным в нем. В этом случае, не насмехайтесь над списком, а насмехайтесь над объектами данных, которые вы в него помещаете.

0 голосов
/ 20 октября 2019

Ну, вы предоставили очень меньше информации. Но позвольте мне пройти через

у вас должен быть BinCountryCheckFilter класс. Пожалуйста, инициализируйте его в своем тестовом классе и добавьте аннотацию @InjectMocks

@InjectMock
private BinCountryCheckFilter binCountryCheckFilter;

, извлеките riskFilterService = Mockito.mock(RiskFilterService.class); из @BeforeClass и поместите его открыто.

Но это просто высмеет ваш класс ине буду ничего проверять. Одна вещь, которую вы можете проверить, это отсутствие звонков. См. Ниже

verify(mockList, times(1)).yourMethodName(); 

или добавьте следующее в своем тесте или перед методом

when(riskFilterService.yurMethodName).thenReturn(your Return value);

Таким образом, вы сможете высмеивать нужные данные. Дайте мне знать, если понадобится какая-либо другая ясность.

Я не уверен в вашей версии JUnit, но вы можете удалить

comelete @BeforeClass из вашего кода сейчас и

 @Mock
    List<RiskFilters> mockList = new ArrayList<RiskFilters>();

тоже.

...