gpt4 book ai didi

java - mockito junit 中未涵盖接口(interface)中的方法

转载 作者:行者123 更新时间:2023-12-02 00:35:01 25 4
gpt4 key购买 nike

我正在使用mockito-junit 来测试我的一段代码。随着进展,我发现我正在测试的主文件中实现了一个接口(interface),当测试运行时,我发现调用接口(interface)方法的行被覆盖,但真正的方法没有被覆盖。

这是主文件的代码:

public class ExtractCurrencyDataTask {

private static final Logger LOGGER = LoggerFactory.getLogger(ExtractCurrencyDataTask.class);

@Autowired
private ExtractCurrencyService extractCurrencyService;

public void writeCurrencyListToFile(List<Currency> currencyList) {
if (currencyList != null && !currencyList.isEmpty()) {
String dir = "A path";
String fileName = "A filename";
String writeToFile = dir + "/" + fileName + ".writing";
String renameFile = dir + "/" + fileName + ".dat";

BufferedWriter writer = null;
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter(writeToFile);
writer = new BufferedWriter(fileWriter);
extractCurrencyService.extractCurrencyList(currencyList, writer);
} catch (Exception e) {
throw new RuntimeException("Error writing Currency codes", e);
} finally {
if (writer != null) {
try {
writer.close();
fileWriter.close();
} catch (IOException e) {
LOGGER.info("Exception occured while closing the file writer", e);
}
moveFile(writeToFile, renameFile);
}
}
}
}

private void moveFile(String writeToFile, String renameFile) {
try {
FileUtils.moveFile(FileUtils.getFile(writeToFile), FileUtils.getFile(renameFile));
} catch (IOException e) {
LOGGER.info("Exception occured while moving file from writing to dat", e);
}
}

这里extractCurrencyService就是我提到的接口(interface)。

界面:

public interface ExtractCurrencyService {

public void extractCurrencyList(List<Currency> currency, Writer writer);

}

这是由另一个实现相同接口(interface)的文件完成的方法定义 Filename:ExtractCurrencyServiceImpl.java

public class ExtractCurrencyServiceImpl implements ExtractCurrencyService {
private static final String SEP = "|";
private static final String NEWLINE = "\n";

@Override
public void extractCurrencyList(List<Currency> currencyList, Writer writer) {
if (currencyList != null) {
currencyList.forEach(currency -> {
String code = currency.getCode();
String name = currency.getName() == null ? "" : currency.getName();
Long noOfDecimals = currency.getNumberOfDecimals();
RoundingMethodValue roundingMethod = currency.getRoundingMethod();
boolean isDealCurrency = currency.isDealCurrency();
String description = currency.getDescription() == null ? "" : currency.getDescription();
try {
writer.write(createCurrencyDataLine(code,
name,
noOfDecimals,
roundingMethod,
isDealCurrency,
description));
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}
}

private String createCurrencyDataLine(String code,
String name,
Long noOfDecimals,
RoundingMethodValue roundingMethod,
boolean isdealCurrency,
String description) {
return code + SEP + name + SEP + noOfDecimals.toString() + SEP + roundingMethod.toString() + SEP
+ isdealCurrency + SEP + description + NEWLINE;
}

public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> map = new ConcurrentHashMap<>();
return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

}

这是测试文件:

@RunWith(MockitoJUnitRunner.class)
public class ExtractCurrencyDataTaskTest {

@Mock
private Currency mockCurrency;

@Mock
private ExtractCurrencyService mockExtractCurrencyService;

@Mock
private BufferedWriter mockBufferWriter;

@Mock
private Bean mockBean;

@InjectMocks
private ExtractCurrencyDataTask extractCurrencyDataTask;

@Test
public void writeCurrencyListToFileTest() {
List<Currency> currencyList = new ArrayList();
when(mockCurrency.getCode()).thenReturn("USD");
when(mockCurrency.getNumberOfDecimals()).thenReturn((long) 2);
when(mockCurrency.getRoundingMethod()).thenReturn(enum value);
when(mockCurrency.isDealCurrency()).thenReturn(true);
when(mockCurrency.getName()).thenReturn("US Dollars");
when(mockCurrency.getDescription()).thenReturn("Currency Description");
currencyList.add(mockCurrency);
extractCurrencyDataTask.writeCurrencyListToFile(currencyList);
}
}

这是 Autowired bean 的配置

@Bean
public ExtractCurrencyService extractCurrencyService() {
return new ExtractCurrencyServiceImpl();
}

正如您所看到的,此过程的实际输出是在提到的路径中创建一个包含一些数据的文件。在此测试中,我模拟数据并将其传递到主文件。主文件是在各自路径中创建的文件,但文件中没有数据。数据写入部分是通过接口(interface)方法完成的。这是我需要帮助的部分。

提前致谢......

最佳答案

您正在将 ExtractCurrencyService 的模拟注入(inject)到您的测试类中。因此,测试是使用此模拟实例而不是 ExtractCurrencyServiceImpl 运行的。当前的行为是您的 ExtractCurrencyDataTask 测试类正在调用 extractCurrencyService#extractCurrencyList,但此 extractCurrencyService 是一个模拟,而不是您的真正实现,因此调用已完成,但没有执行任何操作。

如果您想对 ExtractCurrencyDataTask 进行单元测试,那么没问题,但也许您应该断言对 extractCurrencyService#extractCurrencyList 的调用已按照您期望的方式完成。

如果您想对 ExtractCurrencyServiceImpl 进行单元测试,请为此类创建一个单元测试。

如果您想测试这两个类之间的交互,请创建一个集成测试,其中 ExtractCurrencyDataTask 注入(inject)了 ExtractCurrencyServiceImpl 的真实实例,而不是模拟。

关于java - mockito junit 中未涵盖接口(interface)中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57986251/

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