首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java Mockito验证抽象方法

java Mockito验证抽象方法
EN

Stack Overflow用户
提问于 2020-04-19 20:08:33
回答 1查看 48关注 0票数 0

我在使用verify()方法验证对被测类的方法的调用时遇到了一个问题,它告诉我对该方法的调用并没有完成,这个方法在超类(loadFile(String))中被定义为抽象的。

在下面的代码中找到:

代码语言:javascript
复制
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;
            }

        };

    }

测试方法为:

代码语言:javascript
复制
    @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);
    }

verify( jsonfileParser,times(1)).readBlock(anyObject();return false;这一行表示未调用jsonfileParser的方法loadFile可以让您知道为什么没有调用它。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-19 21:53:47

这是因为您在创建JsonFileParser之后初始化了模拟。请注意,@Before方法是在初始化测试类的所有字段之后执行的。

因此,您需要将null依赖项传递给该类。对null FileValidator的调用抛出了NullPointerException,但您在catch块中接受了它。

通常,建议您验证传递给构造函数和方法的参数,以便在出现错误时快速失败。例如,Java提供了一个方便的Objects::requireNonNull方法来验证传递的参数是否是非空的。

类似地,吞下每一个异常通常是一种糟糕的做法。例如,在您的示例中,您希望抛出IOExceptionJsonProcessingException。最好是显式地捕获这些错误,并让程序崩溃(或者至少记录一个警告)。

最后,模仿和间谍很容易过度使用。通常,使用接口的伪实现就足够了。根据您对代码的控制程度,您可能还想重构它,以避免使用间谍。在代码中使用一个您可以自由更改的代码可能会发出架构问题的信号。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61304078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档