Mock Service без использования конструктора с Autowire, но с использованием метода Java - PullRequest
0 голосов
/ 03 ноября 2019

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

@Service
public class BinCountryCheckFilterImpl {

    private RiskFilterService riskFilterService;
    private Terminals terminal;

    @Autowired
    public BinCountryCheckFilterImpl(Terminals terminal, RiskFilterService riskFilterService) {  
        this.terminal = terminal;
        this.riskFilterService = riskFilterService;
    }

    public void validateBinCountryCheckFilter(Terminals terminal) throws JAXBException, JsonProcessingException {

        List<RiskFilters> filter_list = riskFilterService.findRiskFiltersByTerminalIdAndType(terminal.getId(), "BinCountryCheckFilter");
    }
}

JUnit test:

public class BinCountryCheckFilterImplTest    {

    @Test
    public void testBinCountryCheckFilterImpl() throws JsonProcessingException, JAXBException {
        //Arrange
        RiskFilterService riskFilterService = Mockito.mock(RiskFilterService.class);
        Terminals terminal = Mockito.mock(Terminals.class);

        BDDMockito.given(
            riskFilterService.findRiskFiltersByTerminalIdAndType(anyInt(), anyString()))
            .willReturn(riskFiltersList);

        int expectedInt = 11;
        String expectedString = "BinCountryCheckFilter";

        when(terminal.getId()).thenReturn(expectedInt);

        BinCountryCheckFilterImpl binCountryCheckFilterImpl = 
            new BinCountryCheckFilterImpl(terminal, riskFilterService);

        //Act
        binCountryCheckFilterImpl.validateBinCountryCheckFilter();

        //Assert
        then(riskFilterService)
          .should()
          .findRiskFiltersByTerminalIdAndType(expectedInt, expectedString);
    }    
}

Этот код НЕ работает:

    @Service
public class BinCountryCheckFilterImpl {

    @Autowired
    @Qualifier("riskFilterService")
    private RiskFilterService riskFilterService;

    public Response validateBinCountryCheckFilter(Merchants merchant, Contracts contract, Terminals terminal,
              PaymentTransaction message, HttpServletRequest request) throws JAXBException, JsonProcessingException {
               ...........

    }

}

По какой-то причине riskFilterService в пустомкогда я запускаю тест JUnit. Есть ли способ правильно реализовать сервис с помощью теста JUnit? В моем случае я не хочу вызывать terminal из конструктора, а из метода Java validateBinCountryCheckFilter(...) и riskFilterService в качестве службы Autowired.

Одиночный компонент BinCountryCheckFilterImpl не может иметь терминал значения для каждого запросакак поле, то есть как параметр в конструкторе, когда код развернут, но он работает с тестом JUnit. Если значение терминала должно быть передано как параметр метода, код JUnit не будет работать.

Не могли бы вы посоветовать, пожалуйста?

Ответы [ 2 ]

4 голосов
/ 10 ноября 2019

Я предполагаю, что вы используете JUnit4. Самый простой способ сделать это - использовать MockitoJUnitRunner следующим образом:

@RunWith(MockitoJUnitRunner.class)
public class BinCountryCheckFilterImplTest {

    @InjectMocks
    private BinCountryCheckFilterImpl binCountryCheckFilter;

    @Mock
    private RiskFilterService riskFilterService;


    @Test
    public void testBinCountryCheckFilterImpl() {
        // test content
    }

}

Чтобы использовать JUnit 5, вы должны изменить @RunWith(MockitoJUnitRunner.class) на @ExtendWith(MockitoExtension.class). Конечно, все, что используется @Test, также должно быть из JUnit 5. Но аннотации Mockito @InjectMocks и @Mock такие же, как и в JUnit 4.

Однако вы также можете использоватьSpring org.springframework.test.util.ReflectionTestUtils для установки поля после вызова конструктора с проверенным сервисом. Я предпочитаю первый способ перед отражением, но это ближе к вашему текущему коду.

riskFilterService = Mockito.mock(RiskFilterService.class);
binCountryCheckFilter = new BinCountryCheckFilterImpl();
ReflectionTestUtils.setField(binCountryCheckFilter, "riskFilterService", riskFilterService);
0 голосов
/ 10 ноября 2019

Изменить существующий код на:

public class BinCountryCheckFilterImpl {
    private final RiskFilterService riskFilterService;

    public BinCountryCheckFilterImpl(@Qualifier("riskFilterService") RiskFilterService riskFilterService) {
        this.riskFilterService = riskFilterService;
    }


    public void validateBinCountryCheckFilter(......) throws JAXBException, JsonProcessingException {
                   .........................
        }
}
...