gpt4 book ai didi

java - 您将如何测试静态方法 URLEncoder.encode?

转载 作者:行者123 更新时间:2023-12-02 01:31:05 24 4
gpt4 key购买 nike

我有以下方法。

 protected static String encode(String url) {
try {
url = URLEncoder.encode(url, StandardCharsets.UTF_8.toString());
} catch (Exception e) {
LOGGER.warn("exception occured while encoding url {}", url);
}
return url;
}

我无法为此提供 junit 测试,因为我无法模拟 URLEncoder。此方法有 2 种可能的结果

  • 编码后的网址
  • 原始网址(如有异常(exception))

我能够为第一个结果创建一个测试方法。您将如何为第二个结果创建测试方法?

最佳答案

The fundamental theorem of software engineering (FTSE) is a term originated by Andrew Koenig to describe a remark by Butler Lampson attributed to the late David J. Wheeler:

"We can solve any problem by introducing an extra level of indirection."

[...]

该定理经常通过幽默的子句“……除了太多间接层次的问题”来扩展,指的是太多的抽象可能会产生其本身内在的复杂性问题。 (来源:Wikipedia)

假设有一个类有一个名为 encode 的静态方法:

public final class UrlHelper {
protected static String encode(String url) {
try {
url = URLEncoder.encode(url, StandardCharsets.UTF_8.toString());
} catch (Exception e) {
LOGGER.warn("exception occured while encoding url {}", url);
}

return url;
}
}

你的代码依赖于它:

public class MyClass {
public void doSomething(String someUrl) {
// ...
String encodedUrl = UrlHelper.encode(someUrl);
// ...
}
}

你想测试MyClass.doSomething(String someUrl)但你想 mock UrlHelper.encode(someUrl) 。一种选择是定义另一个类,例如

public final class MyUrlHelper {
protected String encode(String url) {
return UrlHelper.encode(someUrl);
}
}

MyUrlHelper.encode(String url)不是静态的,您可以重构原始代码并通过依赖注入(inject)和模拟非静态 MyUrlHelper.encode(String url) 来测试它:

// Refactored
public class MyClass {

private MyUrlHelper myUrlHelper;

public UrlHelper(MyUrlHelper muUrlHelper) {
this.myUrlHelper = myUrlHelper;
}


public void doSomething(String someUrl) {
// ...
String encodedUrl = myUrlHelper.encode(someUrl);
// ...
}
}

// Test
@Test
public void myTest() {
// setup myUrlHelper and configure it
MyUrlHelper myUrlHelper = mock(MyUrlHelper.class);
when(myUrlHelper.encode(...)).thenReturn(...);


// inject
MyClass myObject = new MyClass(myUrlHelper);

// stimulate
myObject.doSomething("...")
}

另一种选择是使用 PowerMockRunner 来使用 Mockito,如 @Marimuthu Madasamy 所解释的。

<小时/>

但是,我认为 mock 没有任何好处 UrlHelper.encodeURLEncoder.encode这里。它不是一个外部系统(数据库、文件系统、消息代理、SOAP API、REST API 等),因此我看不到模拟它有任何好处。

关于java - 您将如何测试静态方法 URLEncoder.encode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56050236/

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