gpt4 book ai didi

Java - 如何测试永远不会发生的异常?

转载 作者:行者123 更新时间:2023-11-29 08:35:15 27 4
gpt4 key购买 nike

我有 Utils 类和 method,当给定的数据不正确时会抛出异常。

我也有使用此方法服务,但数据始终以在调用期间正确的方式生成。数据由另一个实用程序类生成。

我知道我应该从 Utils 类中抛出这个异常 - 但我不能从 Service 中抛出它 - 所以我必须捕获它。

我如何测试这个,模拟这个异常?对此数据的所有操作都在私有(private)方法中。

我想避免使用 PowerMock,因为我听说这是糟糕设计的标志。所以问题是,如何在良好的设计中实现这一点?

最佳答案

根据您的描述,它看起来是这样的:

class Service {

public void someMethod() {
Data data = AnotherUtils.getData();

try {
Utils.method(data); // exception never thrown
} catch(Exception e) {
// how to test this branch?
}
}

}

目标应该是这样的:

interface DataProvider {
Data getData();
}

interface DataConsumer {
void method(Data data);
}

class Service {
private final DataProvider dataProvider;
private final DataConsumer dataConsumer;

public Service(DataProvider dataProvider, DataConsumer dataConsumer) {...}

public void someMethod() {
Data d = dataProvider.getData();

try {
dataConsumer.method(data);
} catch(Exception e) {

}
}
}

此技术称为 dependency injection .

然后,在测试时,您可以简单地为这个 DataProvider 接口(interface)提供一个模拟实现,该接口(interface)确实返回错误数据:

@Test(expected=Exception.class)
public void myTest() {
DataProvider badDataProvider = () -> new BadData(); // Returns faulty data

Service service = new Service(badDataProvider, Utils.getConsumer());
service.someMethod(); // boom!
}

对于非测试代码,您可以简单地包装这些接口(interface)中已有的实用程序类:

class AnotherUtils {
public static Data getData() {...}

public static DataProvider getProvider() {
return AnotherUtils::getData;
}
}

...

Service service = new Service(AnotherUtils.getProvider(), Utils.getConsumer());

关于Java - 如何测试永远不会发生的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44606272/

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