java Mockito проверяет абстрактный метод - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть проблема при проверке вызова метода тестируемого класса, используя метод verify (), который сообщает, что вызов этого метода не сделан, этот метод определен как абстрактный в суперклассе (loadFile (String) )

найти ниже код:

public abstract class FileParser {
public Iterator<String> loadFile(FileSettingsToSend fileSetting) {

        System.out.println("file before staged");
        try {
        if(!movFile("staged",fileSetting)) 
             return null;
        System.out.println("file after move "+fileSetting.getFile().getAbsolutePath());
        boolean isValidFormatFile = fileValidator.checkFileFormat(fileSetting);
        if (!isValidFormatFile) {
            System.out.println("file format is not valid");
            return null;
        }

            return readBlock(fileSetting);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return null;
        } finally {

        }

        //return null;
    }

    public abstract Iterator<String> readBlock(FileSettingsToSend fileSettingsToSend)
            throws JsonProcessingException, IOException;
}

public  class JsonFileParser extends FileParser {

    public final ObjectMapper mapper = new ObjectMapper();

    @Autowired
    public JsonFileParser(FileValidator jsonFileValidatorService, FileAttributeService fileAttributeService) {
        super(jsonFileValidatorService, fileAttributeService);
    }

    @Override
    public Iterator<String> readBlock(FileSettingsToSend fileSetting) throws JsonProcessingException, IOException {
        ObjectMapper mapper = new ObjectMapper();
        System.out.println("inside readBlock json implementation");
        List<String> listAttribute = fileAttributeService.getAttributes(fileSetting.getDiretoryPath());
        String[] blocDelimitor = fileAttributeService.getDelimitorRepositpry(fileSetting.getDiretoryPath());
        System.out.println("after validator");
        final JsonNode root = mapper.readTree(fileSetting.getFile());
        if (root == null)
            return null;
        Iterator<JsonNode> nodeIterator = root.elements();
        System.out.println("Data is " + root);
        return new Iterator<String>() {
            JsonNode node;

            @Override
            public boolean hasNext() {

                return nodeIterator.hasNext();
            }

            @Override
            public String next() {
                int i = 0;
                node = nodeIterator.next();
                System.out.println("after nex " + node.toString());
                Arrays.stream(blocDelimitor).forEach(e -> {
                    node = node.path(e);
                    System.out.println("inside next " + node.toString());
                });
                String result = null;
                if (node.isArray()) {
                    System.out.println("It is Array");
                    for (JsonNode node1 : node) {

                        if (i != 0)
                            result = result + "," + listAttribute.stream().map(e -> e + "=" + node1.get(e))
                                    .collect(Collectors.joining(","));
                        else
                            result = listAttribute.stream().map(e -> e + "=" + node1.get(e))
                                    .collect(Collectors.joining(","));
                        i++;
                    }
                } else
                    result = listAttribute.stream().map(e -> e + "=" + node.get(e)).collect(Collectors.joining(","));
                return result;
            }

        };

    }

Метод теста:

    @Mock
    FileValidator jsonFileValidatorService;
    @Mock
    FileAttributeService fileAttributeService;
    JsonFileParser jsonFileParserMock = new JsonFileParser(jsonFileValidatorService, fileAttributeService);

    @Test
    public void validatorNotTrue() throws JsonProcessingException, IOException{

        when(jsonFileValidatorService.checkFileFormat( anyObject() )).thenReturn(true);
        JsonFileParser jsonFileParser  = Mockito.spy(jsonFileParserMock);
        doReturn(true).when(jsonFileParser).movFile(anyString(),anyObject() );
        assertNull(jsonFileParser.loadFile(null));

        verify(jsonFileParser, times(1)).movFile(anyString(),anyObject());
        assertTrue(jsonFileParser.movFile(anyString(), anyObject()));
        assertTrue(jsonFileValidatorService.checkFileFormat( anyObject() ));

        //exception.expect(Exception.class);
        verify(jsonFileParser,times(1)).readBlock(anyObject();

    }

    @BeforeClass
    public static  void settingUp(){

    }

    @Before
    public void initMock(){
        MockitoAnnotations.initMocks(this);
    }

строка проверки (jsonFileParser, times (1)). ReadBlock (anyObject ( ); вернуть false; это означает, что метод loadFile из jsonfileParser, который не был вызван, может заставить вас сказать, почему он не вызывается. Спасибо.

1 Ответ

1 голос
/ 19 апреля 2020

Это происходит потому, что вы инициализируете макеты после создания JsonFileParser. Обратите внимание, что метод @Before выполняется после инициализации всех полей вашего тестового класса.

В результате вы передаете классу null зависимостей. При вызове null FileValidator выдается NullPointerException, но вы проглатываете его в блоке catch.

Обычно рекомендуется проверять аргументы, передаваемые вашим конструкторам и методам, для быстрого сбоя в случай ошибки. Например, Java поставляется с удобным методом Objects :: requireNonNull , чтобы проверить, что переданные параметры не равны нулю.

Точно так же, как правило, плохая практика - глотать каждое исключение. Например, в вашем примере вы ожидаете, что IOException и JsonProcessingException будут выброшены. Лучше поймать их явно и позволить программе обработать sh (или, по крайней мере, записать предупреждение) для любого другого.

Наконец, издевательства и шпионы склонны к чрезмерному использованию. Обычно достаточно использовать фальшивые - фиктивные реализации ваших интерфейсов. В зависимости от того, насколько вы контролируете код, вы также можете реорганизовать его, чтобы вообще не использовать шпиона. Использование кода в коде, который вы можете свободно изменять, может сигнализировать о архитектурной проблеме.

...