gpt4 book ai didi

java Mockito 验证抽象方法

转载 作者:行者123 更新时间:2023-12-02 08:42:22 25 4
gpt4 key购买 nike

我在验证对被测类的方法的调用时遇到问题,使用 verify() 方法,它告诉该方法没有对该方法进行调用,该方法在父类(super class)中定义为抽象方法(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);
}

行 verify(jsonFileParser,times(1)).readBlock(anyObject(); return false; 表示未调用 jsonfileParser 的 loadFile 方法你能告诉你为什么它没有被调用吗?谢谢。

最佳答案

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

因此,您将 null 依赖项传递给该类。对 null FileValidator 的调用会抛出 NullPointerException,但您将其吞入 catch block 中。

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

同样,吞下每一个异常通常是一种不好的做法。例如,在您的示例中,您期望抛出 IOException 和 JsonProcessingException 。最好明确地捕获这些并让程序因任何其他问题而崩溃(或至少记录警告)。

最后,模拟和 spy 很容易被过度使用。通常,使用假货(接口(interface)的虚拟实现)就足够了。根据您对代码的控制程度,您可能还需要重构它以避免使用 spy 。在您可以自由更改的代码中使用一个可能表明存在体系结构问题。

关于java Mockito 验证抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61304078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com